2014-02-06 2 views
0

Я играю с FFT и не могу получить ожидаемые результаты. У меня есть звуковой клип, который я записал с микрофона, установленного на аналоговых часах. Таким образом, звук звучит каждую секунду.FFT in matlab, неожиданные результаты

[wave,fs]=wavread('clock.wav'); 
t=0:1/fs:(length(wave)-1)/fs; 
plot(t,wave); 
n=length(wave)-1;            
f=0:fs/n:fs; 
wavefft=abs(fft(wave)); 
plot(f,wavefft); 

Это код, который я использую. И вот результаты.

Я должен видеть огромный всплеск на 1hz, но я не уверен.

FFT, за которым следует звуковая волна.

This is the FFT

And this is the sound wave

+0

Вы должны понимать, что на первом изображении ось «x» не отражает фактическую частоту.Когда вы выполняете БПФ, результат симметричен в 0 Гц, и вы можете четко видеть, что ваш БПФ является симметричным в 4000 или около того. Таким образом, результат, вероятно, правильный, но вы не строите его правильно. –

+0

@AnderBiguri Это не имеет значения, поскольку спектр периодичен около 4000, что в данном случае является fs/2. Этот формат является defult для функции 'fft'. Чтобы показать specrtum вокруг нуля, вы должны использовать 'fftshift'. – Adiel

+0

@Adiel Вы полностью готовы, я просто быстро посмотрел на проблему, и я ошибаюсь. –

ответ

0

То, что вы видите, что ваш микрофон записал. Стандартные микрофоны фильтруют очень низкие частоты, то есть ниже 20 Гц, и звуковая карта, вероятно, также фильтрует низкие частоты.

Наличие галочки каждую секунду не означает, что вы увидите огромный пик на частоте 1 Гц на вашем БПФ. Если вы хотите увидеть, что огромный пик на 1 Гц, запишите сигнал, сделанный из синуса на частоте 1 Гц. Но, как я сказал выше, будьте осторожны с низкими частотами. Обычная частота для тестирования звуковой системы составляет 1000 Гц.

Ниже приведен временной вид с увеличением вашего сигнала clock.wav. Мы видим, что он состоит из многих гармоник, и мы можем ясно видеть, что это далеко не синусоидальная волна на частоте 1 Гц.

enter image description here

Затем я фильтруют сигнал с нижних частот 2-го типа порядка Баттерворта с частотой среза 100 Гц.

Пожалуйста, смотрите в желтом спектре перед фильтрацией и синим после фильтрации.

Spectrum of the signal Spectrum of the signal after low-pass

Таким образом, я считаю, нет большой проблемы в коде Matlab.

+0

Если вы посмотрите на картинку выше (вторая), вы увидите, что микрофон ее подбирает. – user1348051

+0

Все еще вряд ли верю, что ваш входной сигнал действительно имеет гармоники 1 Гц, записанные вашей звуковой картой. Не могли бы вы оставить файл clock.wav где-нибудь, и я попробую с моим скриптом python (используя scipy.signal)? Кроме того, если вы хотите быть уверенным, что есть гармоники 1 Гц, фильтр нижних частот будет фильтровать ваш сигнал. Используйте butterworth или Чебычев с частотой среза 1 Гц, и вы увидите. – RawBean

+0

Они не 1hz гармоники. Они звучат на расстоянии 1 секунды. – user1348051

0

Обратите внимание, что у вас много шума между вершинами во временной области. Это кажется мало во времени, но значительно значимо в частотной области. Возможно, основная частота шума составляет около 1000+ Гц.

Попытка записать снова, без тиков (только «молчание»), и вычесть его из исходного сигнала ... Я сомневаюсь, что он будет работать, но вы можете попробовать ...

Вы может также просто выбрать пики из сигнала, простым порогом, а затем вы останетесь только с тактированием часов.

EDIT: еще одно предложение - передать сигнал в фильтр нижних частот, чтобы фильтровать высокочастотный шум.

0

Поскольку вы ищете частоту низких частот в огибающей амплитуды звукового клипа, а не форму сигнала тона или высоту тона, вы можете попробовать квадрат или принять абсолютное значение вашего сигнала перед применением fft, а затем игнорировать в результате получается более высокая частота.

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