2013-03-08 25 views
18

iOS có sự cố ghi âm qua một số thiết bị âm thanh USB. Nó không thể được tái tạo một cách đáng tin cậy (xảy ra mỗi 1 trong ~ 2000-3000 bản ghi theo lô và âm thầm biến mất), và chúng tôi hiện đang kiểm tra âm thanh của mình theo cách thủ công cho bất kỳ vấn đề ghi nào. Kết quả là một số lượng nhỏ mẫu (1-20) bị dịch chuyển bởi một số nhỏ nghe có vẻ giống như một 'tiếng lách'.Làm cách nào để phát hiện những bất thường về âm thanh này?

Họ trông như thế này:

Waveform with abnormality

gần:

enter image description here

gần:

enter image description here

khác, Erro mẫu đơn r ở những nơi khác trong cùng một tập tin âm thanh:

enter image description here

Câu hỏi đặt ra là, làm thế nào có thể những thuật toán được được phát hiện (giả sử truy cập trực tiếp đến mẫu) trong khi không kích hoạt dương tính giả về âm thanh tần số cao với dạng sóng như thế này:

enter image description here

Điểm thưởng: sau khi xác định càng nhiều lỗi càng tốt, âm thanh có thể được 'cố định' như thế nào?

điểm thưởng thêm: những gì có thể gây ra vấn đề này trong các trình điều khiển âm thanh iOS USB/phần cứng (giả sử nó là ở đó).

+0

Bạn có thể thấy http://dsp.stackexchange.com/ hữu ích. – keyboardP

+0

là nó có thể crosspost? –

+0

Rất khó bởi vì có vẻ như việc đăng bài chéo được cau mày một chút theo http://meta.stackexchange.com/questions/64068/is-cross-posting-a-question-on-multiple-stack-exchange-sites- allow-if-the-qu Có nói rằng, bạn có thể đăng trên một trang web (nghĩa là vẫn ở đây hoặc xóa bài đăng này và đăng trên DSP) và nếu bạn không nhận được câu trả lời thỏa đáng, hãy xóa nó và đăng lên trang khác trang web. Câu hỏi này có giá trị ở đây IMO nhưng tôi đã đề xuất DSP đơn giản chỉ vì nó có thể có nhiều chuyên gia hơn trong miền này. – keyboardP

Trả lời

12

Tôi không nghĩ rằng có một giải pháp trong hộp để tìm ra những xáo trộn, nhưng đây là một cách (không chuẩn) để giải quyết vấn đề. Sử dụng điều này, tôi có thể tìm thấy hầu hết các khoảng thời gian và tôi chỉ nhận được một số lượng nhỏ các mặt tích cực sai, nhưng thuật toán chắc chắn có thể sử dụng một số điều chỉnh tốt.

Ý tưởng của tôi là tìm điểm bắt đầu và điểm kết thúc của các mẫu lệch. Bước đầu tiên nên làm cho những điểm này nổi bật rõ ràng hơn. Điều này có thể được thực hiện bằng cách lấy logarit của dữ liệu và lấy sự khác biệt giữa các giá trị liên tiếp.

Trong MATLAB tôi tải dữ liệu (trong ví dụ này tôi sử dụng mẫu bẩn khác.wav)

y1 = wavread('dirty-sample-pictured.wav'); 
y2 = wavread('dirty-sample-other.wav'); 
y3 = wavread('clean-highfreq.wav'); 

data = y2; 

và sử dụng đoạn mã sau:

logdata = log(1+data); 
difflogdata = diff(logdata); 

Vì vậy, thay vì âm mưu này của dữ liệu gốc:

original data

chúng tôi nhận được:

diff-log-data

trong đó các khoảng thời gian chúng tôi đang tìm kiếm nổi bật là điểm tăng tích cực và tiêu cực. Ví dụ, phóng to trên giá trị dương lớn nhất trong cốt truyện của sự khác biệt lôgarít, chúng ta nhận được hai số liệu sau đây. Một cho dữ liệu gốc:

Original data zoomed

và một cho sự khác biệt của logarit:

Diff-log-data zoomed

âm mưu này có thể giúp việc tìm kiếm các lĩnh vực bằng tay nhưng lý tưởng chúng tôi muốn tìm thấy chúng sử dụng một thuật toán. Cách tôi đã làm điều này là để có một cửa sổ di chuyển của kích thước 6, tính toán giá trị trung bình của cửa sổ (của tất cả các điểm ngoại trừ giá trị tối thiểu), và so sánh điều này với giá trị tối đa. Nếu điểm tối đa là điểm duy nhất cao hơn giá trị trung bình và ít nhất là gấp đôi giá trị trung bình thì nó được tính là giá trị cực dương.

Sau đó tôi đã sử dụng một ngưỡng đếm, ít nhất một nửa số cửa sổ di chuyển trên giá trị sẽ phát hiện nó là giá trị cực đoan để nó được chấp nhận.

Nhân tất cả các điểm bằng (-1) thuật toán này sau đó chạy lại để phát hiện các giá trị tối thiểu.

Đánh dấu các cực dương với "o" và cực âm với "*" chúng tôi nhận được hai ô sau đây. Một cho sự khác biệt của logarit:

diff-log-data with found extremes

và một cho dữ liệu gốc:

Phóng to về phía bên trái của hình cho thấy sự khác biệt logarit chúng ta có thể thấy rằng hầu hết các giá trị cực đoan được tìm thấy:

diff-log-data with found extremes zoomed

Có vẻ như hầu hết các khoảng thời gian được tìm thấy và chỉ có một số lượng nhỏ các kết quả dương tính giả. Ví dụ: chạy thuật toán trên 'clean-highfreq.wav' Tôi chỉ tìm thấy một giá trị cực dương và cực âm.

Giá trị đơn lẻ được phân loại sai là giá trị cực có thể bị loại bỏ bằng cách khớp với điểm bắt đầu và điểm kết thúc. Và nếu bạn muốn thay thế dữ liệu bị mất, bạn có thể sử dụng một số loại nội suy bằng cách sử dụng các điểm dữ liệu xung quanh, có lẽ ngay cả một nội suy tuyến tính cũng sẽ đủ tốt.

Đây là MATLAB mã tôi đã sử dụng:

function test20() 
clc 
clear all 

y1 = wavread('dirty-sample-pictured.wav'); 
y2 = wavread('dirty-sample-other.wav'); 
y3 = wavread('clean-highfreq.wav'); 

data = y2; 

logdata = log(1+data); 
difflogdata = diff(logdata); 

figure,plot(data),hold on,plot(data,'.') 
figure,plot(difflogdata),hold on,plot(difflogdata,'.') 

figure,plot(data),hold on,plot(data,'.'),xlim([68000,68200]) 
figure,plot(difflogdata),hold on,plot(difflogdata,'.'),xlim([68000,68200]) 

k = 6; 
myData = difflogdata; 
myPoints = findPoints(myData,k); 

myData2 = -difflogdata; 
myPoints2 = findPoints(myData2,k); 

figure 
plotterFunction(difflogdata,myPoints>=k,'or') 
hold on 
plotterFunction(difflogdata,myPoints2>=k,'*r') 

figure 
plotterFunction(data,myPoints>=k,'or') 
hold on 
plotterFunction(data,myPoints2>=k,'*r') 

end 

function myPoints = findPoints(myData,k) 

iterationVector = k+1:length(myData); 
myPoints = zeros(size(myData)); 
for i = iterationVector 
    subVector = myData(i-k:i); 
    meanSubVector = mean(subVector(subVector>min(subVector))); 
    [maxSubVector, maxIndex] = max(subVector); 
    if (sum(subVector>meanSubVector) == 1 && maxSubVector>2*meanSubVector) 
     myPoints(i-k-1+maxIndex) = myPoints(i-k-1+maxIndex) +1; 
    end 
end 

end 

function plotterFunction(allPoints,extremeIndices,markerType) 

extremePoints = NaN(size(allPoints)); 
extremePoints(extremeIndices) = allPoints(extremeIndices); 
plot(extremePoints,markerType,'MarkerSize',15), 
hold on 
plot(allPoints,'.') 
plot(allPoints) 

end 

Edit - ý kiến ​​về việc khôi phục dữ liệu gốc

Dưới đây là một hơi thu nhỏ nhìn của con số ba trên: (sự xáo trộn là giữa 6.8 và 6.82)

Original data zommed out

Khi tôi kiểm tra giá trị, t heory về dữ liệu được nhân đôi để các giá trị tiêu cực dường như không phù hợp với mô hình chính xác. Nhưng trong mọi trường hợp, suy nghĩ của tôi về việc loại bỏ sự khác biệt chắc chắn là không chính xác. Vì các điểm xung quanh dường như không bị thay đổi bởi sự xáo trộn, tôi có lẽ sẽ quay trở lại ý tưởng ban đầu về việc không tin tưởng các điểm trong vùng bị ảnh hưởng và thay vào đó sử dụng một loại nội suy nào đó sử dụng dữ liệu xung quanh. Nó có vẻ như một nội suy tuyến tính đơn giản sẽ là một xấp xỉ khá tốt trong hầu hết các trường hợp.

+0

Đây là một câu trả lời tuyệt vời - cảm ơn vì đã đi sâu vào rất nhiều. Tôi đã phải mượn một bản sao của MATLAB để chơi xung quanh một chút (tôi không quen với nó). Làm thế nào tôi sẽ đi về interpolating các giá trị (sau khi xác định các cặp) để viết ra một 'cố định' wav? –

+0

@AlastairStuart Tuyệt vời mà bạn có thể sử dụng mã MATLAB! Để thiết lập các giá trị mới của một vectơ 'Y', bạn có thể sử dụng cú pháp' Y (startIndex: endIndex) = newValues'. Vì vậy, khi bạn đã xác định các cặp bạn sẽ có thể làm một cái gì đó như 'Y (stInd: enInd) = a + (ba) X' cho một nội suy tuyến tính, trong đó' X' là một vectơ có độ dài thích hợp cho khoảng thời gian '[ 0,1] '. – user1884905

+0

@AlastairStuart Khi tôi nghĩ về nó, nội suy tuyến tính có lẽ không phải là những gì bạn muốn làm. Nếu bạn nhìn vào biểu đồ được phóng to trong câu trả lời của tôi, có vẻ như các giá trị mới phải là một nội suy tuyến tính. Một ý nghĩ là bạn có thể cố gắng loại bỏ sự khác biệt bằng cách dịch chuyển phần còn lại của tín hiệu lên hoặc xuống để bù cho sự dịch chuyển. Một cái gì đó như 'X (currentIndex: end) = X (currentIndex: end) - signalShift'. Tôi không biết nếu sự khác biệt sẽ hủy bỏ lẫn nhau khi làm như thế này. Có lẽ tín hiệu cuối cùng sẽ khác biệt đáng kể so với bản gốc? – user1884905

9

Để trả lời câu hỏi tại sao nó xảy ra -

Một thiết bị âm thanh USB và máy chủ không phải là đồng hồ đồng bộ - mà là để nói rằng chủ nhà không thể phục hồi một cách chính xác mối quan hệ giữa đồng hồ cục bộ của máy chủ và word-đồng hồ của ADC/DAC trên giao diện âm thanh. Các kỹ thuật khác nhau làm exist để phục hồi đồng hồ với các mức độ hiệu quả khác nhau. Để thêm vào vấn đề, đồng hồ xe buýt có thể không liên quan đến một trong hai đồng hồ âm thanh.

Trong khi bạn có thể tưởng tượng điều này không quá quan tâm đối với nhận âm thanh - các cuộc gọi lại âm thanh có thể xảy ra khi có giao diện dữ liệu - âm thanh hai chiều và máy chủ sẽ hiển thị âm thanh ở khoảng thời gian thông thường, đầu kia là khả năng tiêu thụ ở một tỷ lệ hơi khác nhau.

Ở giữa các bộ đệm là một số bộ đệm, có thể quá mức hoặc thiếu, đó là những gì có vẻ đang xảy ra ở đây; khoảng cách giữa nó xảy ra chắc chắn có vẻ đúng.

Bạn có thể thấy rằng việc thay đổi thiết bị âm thanh USB thành một thiết bị được xây dựng xung quanh một bộ chip khác (hoặc chỉ đơn giản là bộ dao động cục bộ khác) sẽ giúp.

Ngoài ra, cả hai luồng truyền tải âm thanh và âm thanh IEEE1394 đều có cùng yêu cầu khôi phục đồng hồ.Cả hai người trong số họ giải quyết vấn đề bằng cách nhúng một gói tham chiếu đồng hồ địa phương vào bitstream nối tiếp theo một cách rất có thể dự đoán cho phép phục hồi đồng hồ chính xác ở đầu kia.

+1

Một cách để kiểm tra xem tốc độ đồng hồ có trôi dạt hay không là vấn đề là xem liệu nó có thay đổi với chênh lệch nhiệt độ giữa hai thiết bị hay không. Ví dụ. Tủ lạnh một và bỏ túi khác ngay trước khi thử nghiệm. Sau đó trao đổi và kiểm tra lại. – hotpaw2

+0

Thật vậy - mặc dù giữ nó lạnh chỉ trong vòng một giờ có thể là một thách thức. Gỡ lỗi những vấn đề này đòi hỏi rất nhiều kiên nhẫn! – marko

2

Tôi nghĩ rằng các thuật toán sau đây có thể được áp dụng cho các mẫu nhằm xác định tiềm năng dương tính giả:

Đầu tiên, quét lượng cao của tần số cao, hoặc thông qua FFT'ing khối âm thanh bởi khối (256 giá trị có thể), hoặc bằng cách đếm các mẫu liên tiếp ở trên và dưới 0. Sau này nên theo dõi tối đa liên tiếp trên không, tối đa liên tiếp dưới 0, lượng chuyển tiếp nhỏ khoảng 0 và khối lượng hiện tại của khối (0..1 khi Audacity hiển thị nó). Sau đó, nếu liên tiếp tối đa dưới 5 (lấy mẫu tại 44100 và số 0 liên tiếp, trong khi mẫu outstsanding là duy nhất, 5 đáp ứng với tần số 4410Hz, là khá cao), hoặc tổng độ dài chuyển tiếp nhỏ vượt quá một giá trị nhất định tùy thuộc vào mức tối đa liên tiếp (tôi tin xấp xỉ đầu tiên sẽ là 3 * 5 * kích thước khối/khoảng cách giữa hai cực đại, gần bằng với khoảng thời gian của tần số FFT lớn nhất. Ngoài ra nó phải được đo cả ngưỡng trên và dưới, vì chúng ta có thể kết thúc với một đỉnh sai lầm, có khả năng sẽ được phát hiện bởi sự khác biệt giữa tiến độ chính được đo trên các giá trị cực đại dưới 0 hoặc trên 0, cũng bằng std-dev của các đỉnh. Nếu tần số cao chiếm ưu thế, khối này chỉ đủ điều kiện cho giá trị 0 Nếu tần số cao là đáng kể, có nghĩa là, có một tần số thấp chiếm ưu thế được phát hiện, chúng ta có thể tìm kiếm các đỉnh lớn hơn 3,0 * khối lượng tần số cao, cũng như các số không bình thường trong khối này .

Ngoài ra, khoảng cách của bạn dường như có độ mở rộng cao hoặc không bằng phẳng, với độ mở rộng cao là các lỗi đơn lẻ và sai số không nằm trong khoảng từ 1-20. Vì vậy, nếu có khoảng không bằng với các giá trị dưới giá trị tuyệt đối 0,02, được bao quanh trực tiếp bởi các giá trị 0,15 (biến được finetuned) hoặc giá trị tuyệt đối cao hơn AND của cùng một dấu, hãy tính điểm này là lỗi. Bạn có thể phát hiện các giá trị đơn lẻ nổi bật nếu bạn tính toán 2.0*(current sample)-(previous sample)-(next sample) và nếu nó vượt quá ngưỡng nhất định (0,1 + âm lượng tần số cao hoặc 3,0 * âm lượng tần số cao, tùy theo mức nào lớn hơn), hãy tính đây là lỗi và trung bình.

Phải làm gì với khoảng cách bằng 0 - chúng ta có thể sao chép các giá trị từ 1 chu kỳ ngược và 1 khoảng thời gian tới (trung bình), trong đó "khoảng thời gian" là tần số quan trọng nhất của FFT của khối. Nếu "khoảng thời gian" nhỏ hơn khoảng trống (giả sử chúng tôi phát hiện một khoảng trống của số 0 trong phần âm thanh cao), hãy sử dụng hai hoặc nhiều khoảng thời gian, vì vậy tất cả dữ liệu nguồn đều hợp lệ (trong trường hợp này, không trung bình có thể được thực hiện, vì nó có thể là tín hiệu 2 thời gian chuyển tiếp từ khoảng cách và 2 giai đoạn trở lại sẽ được trong counterphase). Nếu có nhiều hơn một tần số có biên độ bằng nhau, chúng ta có thể lấy mẫu mẫu này với các pha chính xác, cắt phần còn lại của các tần số ít quan trọng hơn.

Mẫu nổi bật nên IMO chỉ được lấy trung bình bởi 2-4 mẫu xung quanh, vì dường như chỉ có một mẫu duy nhất từng gặp trong tệp âm thanh của bạn.

1

Bạn có thể thử các phương pháp sau đây siêu đơn giản (có thể nó đủ):

  1. Hãy mỗi điểm trong dạng sóng của bạn và trừ tiền nhiệm của nó (nhìn vào những thay đổi từ một điểm đến tiếp theo).
  2. Xem xét sự phân bố của những thay đổi này và tìm độ lệch chuẩn của chúng.
  3. Nếu bất kỳ sự khác biệt nhất định vượt quá X lần độ lệch chuẩn này (trên hoặc dưới), hãy gắn cờ đó là sự cố.
  4. Xác định giá trị tốt nhất cho X bằng cách chơi với nó và xem nó hoạt động tốt như thế nào.
  5. Hầu hết các "vấn đề" sẽ đến như là một cặp của hai sự khác biệt vượt ra ngoài ngưỡng của bạn, một trong những đi lên, và một đi xuống.

Để kết hợp với cách tiếp cận siêu đơn giản, bạn có thể sửa dữ liệu bằng cách nội suy tuyến tính giữa điểm tốt cuối cùng trước phần vấn đề và điểm tốt đầu tiên sau đó. (Đảm bảo rằng bạn không chỉ xóa các điểm vì điều này sẽ ảnh hưởng đến (nâng cao) độ cao của âm thanh của bạn.)

2

Biến đổi wavelet rời rạc (DWT) có thể là giải pháp cho vấn đề của bạn.

Tính toán FFT không hữu ích trong trường hợp của bạn vì biểu diễn trung bình của nội dung tần số tương đối trong toàn bộ thời lượng của tín hiệu và do đó không thể phát hiện các thay đổi tạm thời. Biến đổi tần số thời gian ngắn dicrete (STFT) cố gắng giải quyết điều này bằng cách tính toán DFT cho các khối thời gian liên tiếp ngắn của tín hiệu, chiều dài của nó được xác định bởi chiều dài (và hình dạng) của một cửa sổ, nhưng vì độ phân giải của DFT phụ thuộc vào dữ liệu/chiều dài khối, có một sự cân bằng giữa độ phân giải trong freqency HOẶC trong thời gian, và việc tìm kiếm kích thước cửa sổ cố định huyền diệu này có thể phức tạp!

Điều bạn muốn là phương pháp phân tích tần suất thời gian với độ phân giải thời gian tốt cho các sự kiện tần số cao và độ phân giải tần số tốt cho các sự kiện tần số thấp ... Nhập biến đổi wavelet rời rạc!

Có rất nhiều biến đổi wavelet cho các ứng dụng khác nhau và như bạn có thể mong đợi, nó nặng tính toán. DWT có thể không phải là giải pháp thiết thực cho vấn đề của bạn, nhưng đáng xem xét. Chúc may mắn với vấn đề của bạn.Một số thứ sáu-buổi tối đọc:

http://klapetek.cz/wdwt.html

http://etd.lib.fsu.edu/theses/available/etd-11242003-185039/unrestricted/09_ds_chapter2.pdf

http://en.wikipedia.org/wiki/Wavelet_transform

http://en.wikipedia.org/wiki/Discrete_wavelet_transform

Các vấn đề liên quan