Как убрать шум из записанного звука, используя fft в MATLAB? - PullRequest
2 голосов
/ 04 мая 2011

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

  [y,fs]=wavread('100cmfreefall.wav');

 ch1=y(:,1);
 time=(1/44100)*length(ch1);
t=linspace(0,time,length(ch1));


L=length(ch1);
 NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
Y1=log10(Y);
figure(1)

f = fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y1(1:NFFT/2+1))) ;

[b,a]=butter(10,3000/(44100/2),'high');
Y1=filtfilt(b,a,Y1);

% freqz(b,a)
figure(2)

plot(f,2*abs(Y1(1:NFFT/2+1))) ;

title('Single-Sided Amplitude Spectrum of y(t)');
xlabel('Frequency (Hz)');
ylabel('|Y(f)|')
xlim([0 50000])


% soundsc(ch1(1:100000),44100)

Ответы [ 2 ]

18 голосов
/ 04 мая 2011

Сказать, что в вашем сигнале шум, очень расплывчато и вообще не передает много информации.Вот некоторые из вопросов:

  • Является ли шум высокой частотой или низкой частотой?
  • Хорошо ли он отделен от полосы частот вашего сигнала или смешан в?
  • Соответствует ли шум статистической модели?Можно ли его описать как стационарный процесс?
  • Является ли шум еще одним детерминированным мешающим сигналом?

Ваш подход, безусловно, будет зависеть от ответов на поставленные выше вопросы.

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

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

Простой пример:

Рассмотрим синусоиду с частотой 50 Гц, с выборкой при 1000 Гц.К этому я добавляю гауссовский белый шум, так что SNR составляет ~ -6 дБ.Исходный сигнал и зашумленный сигнал можно увидеть в верхнем ряду на рисунке ниже (показаны только 50 образцов).Как вы можете видеть, это выглядит так, как будто нет надежды с шумным сигналом, поскольку вся структура, кажется, была разрушена.Однако, взяв БПФ, выявляет скрытую синусоиду (показана в нижнем ряду)

enter image description here

Фильтрация зашумленного сигнала с помощью узкополосного фильтра от 48 до 52 Гц дает нам«убран» сигнал.Там, конечно, будут некоторые потери в амплитуде из-за шума.Однако сначала сигнал был получен из того, что выглядело как безнадежное дело.

enter image description here

Порядок действий зависит от вашего конкретного применения.Но я надеюсь, что это помогло вам понять некоторые основы фильтрации шума.

РЕДАКТИРОВАТЬ

@ Shabnam: это было почти 50 комментариев, и я действительно не вижу васприлагая какие-либо усилия, чтобы понять или, по крайней мере, попробовать вещи самостоятельно.Вы действительно должны научиться читать документацию, изучать концепции и пробовать ее вместо того, чтобы возвращаться к каждой отдельной ошибке.В любом случае, пожалуйста, попробуйте следующее (изменено из вашего кода) и покажите вывод в комментариях.

[y,fs]=wavread('100cmfreefall.wav');
ch1=y(:,1);
time=(1/fs)*length(ch1);
t=linspace(0,time,length(ch1));
L=length(ch1);
NFFT = 2^nextpow2(L);
f = fs/2*linspace(0,1,NFFT/2+1);

[b,a]=butter(10,3e3/(fs/2),'high'); 
y1=filtfilt(b,a,ch1);

figure(1)
subplot(2,1,1)
Y=fft(ch1,NFFT)/L;
plot(f,log10(abs(Y(1:NFFT/2+1))))
title('unfiltered')

subplot(2,1,2)
Y1=fft(y1,NFFT)/L;
plot(f,log10(abs(Y1(1:NFFT/2+1))))
title('filtered')
0 голосов
/ 04 мая 2011

Ответ на ваш вопрос в значительной степени зависит от характеристик того, что вы называете «шумом» - его спектрального распределения, стационарного шума или нет, источника шума (происходит ли он в окружающей среде или в цепочке записи?) .

Если шум является стационарным, то есть его статистические характеристики не меняются со временем, вы можете попробовать записать несколько секунд (10-15 - хорошее первоначальное предположение) только шума, выполнить БПФ-преформу, а затем вычесть значение шум в бункере FFT n по вашим измерениям бин FFT n.

Вы можете прочитать некоторые фоны здесь: http://en.wikipedia.org/wiki/Noise_reduction

...