2015-03-18 4 views
2

enter image description here Я хотел бы определить количество claps в данном файле wav.file. Вот моя первая попытка. Я могу нарисовать спектрограмму, но как я могу напечатать количество хлопок в звуке. Мой вывод должен дать мне «Один хлопок» или «Два хлопки».Обнаружение звука Clap

hfile = 'one.wav'; 
[y, Fs] = wavread(hfile); 
mono1 = mean(y,2); 

[S,F,T,P] = spectrogram(mono1,w,120,N,Fs); 
thresh_l=1000; 
thresh_h=10000000; 
% take the segment of P relating to your frequencies of interest 
P2 = P(F>thresh_l&F<thresh_h,:); 
%show the mean power in that band over time 
m = mean(P2); 
plot(T,m); 
+1

У вас есть все звуковые файлы, состоящие из одного или двух хлопок? Есть ли какой-либо фоновый шум или ваш звуковой файл ** только ** состоит из этих хлопающих звуков? – rayryeng

+0

На самом деле было бы лучше дать мне количество хлопок, но в основном звуки волн состоят из 1 или 2 хлопок. –

ответ

2

Мне кажется, что это то, что вы делали бы во временной области, а не в частотной области.

Если аудиофайл чист вы могли бы сделать что-то вроде этого:

  1. обнаружения глобального максимума звукового сигнала
  2. пола сигнал к нулю в малой области вокруг этого максимума, чтобы подавить это триппер
  3. повтор с шага 1. до следующего максимума слишком низкая

код Wou л.д. выглядеть следующим образом:

hfile = 'one.wav'; 
[y, Fs] = wavread(hfile); 

threshold = [user-defined];   %// amplitude to stop looping at 
radius = [user-defined];    %// radius to floor after clap is detected 
number_of_claps = 0;   

while true 
    [max_value,idx] = max(y);   %// detect loudest amplitude 
    if (max_value < threshold)  %// break if all claps are found 
     break; 
    end 

    min_bound = max(1,idx-radius); 
    max_bound = min(idx+radius,length(y)); 
    y(min_bound:max_bound) = 0;  %// ignore region around the clap 
    number_of_claps = number_of_claps + 1; 
end 

number_of_claps 

Это может быть необходимо, чтобы изменить процедуру настила таким образом она игнорирует большую часть справа от индекса, так как «распад» часть сигнала хлопать будет длиться дольше, чем восходящая часть.

+0

Я получаю и ошибка при попытке запустить его, в пороге = [пользовательский]; и radius = [пользовательский]; –

+0

он не может распознать [пользовательский]. –

+1

@ n.ah93 Когда я писал '[user-defined]', я имел в виду, что вы должны сами вводить эти значения. Я не могу сказать, что вам нужны хорошие значения, не глядя на сигнал. Попробуйте 'plot (y)' и ищите, какие соответствующие значения будут. Это может занять несколько проб и ошибок. – eigenchris

Смежные вопросы