我正在研究一個小的代碼來學習Matlab上的信號處理。我收到了一些帶有噪音的.wav聲音,我只是想消除噪音。我嘗試了下面的代碼,但沒有正確刪除噪音。我的想法是做一個切帶濾波器去除fft上的不同噪聲成分。經過大量研究,我不明白我的問題在哪裏。在這裏我的代碼:去除wav文件上的噪音
clear all;
clc;
close all;
% We load and plot the signal
[sig,Fs] = audioread('11.wav');
N = length(sig);
figure,plot(sig); title 'signal'
% FFT of the signal
fft_sig = abs(fft(sig));
% Normalisation of the frequencies for the plot
k = 0 : length(sig) - 1;
f = k*Fs/length(sig);
plot(f,fft_sig);
% Loop with 2 elements because there are 2 amplitudes (not sure about
% this)
for i = 1:2
% I put noise components in an array
[y(i),x(i)] = max(fft_sig);
% Normalisation of the frequencies to eliminate
f(i) = x(i) * (Fs/N);
% Cut band filter with elimination of f from f-20 to f+20 Hz
b = fir1(2 , 2 * [f(i)-20 f(i)+20]/Fs, 'stop')
sig = filter(b,1,sig);
figure,plot(abs(fft(sig)));title 'fft of the signal'
end
在這裏,我得到了圖像,FFT圖正是之前和應用過濾器後是相同的,只有在X軸上的修改:
的採樣頻率是Fs的= 22050.
預先感謝您的幫助,我希望我在我的描述
嘗試使用'freqz'來查看您的過濾器的樣子。你想建立一個陷波濾波器。如果你有dsp工具箱,你可以使用'iirnotch' – crowdedComputeeer
這可能是你的規範化問題。 'fir1'的單位爲rad/sec,你沒有在這個地方考慮過。您也可以丟棄'fft'輸出的後半部分,因爲它僅僅是前半部分的鏡像(否則這可能會影響峯值分量檢測方案)。關於峯值分量檢測,現在您對max(fft_sig)的調用將每次返回相同的精確分量,而您需要它在每次迭代時輸出下一個最大分量。 – Falimond
什麼是最重要的 - 繪製對數級別的大小! – jojek