用陷波滤波器不能消除正弦波

Can't eliminate sine wave with notch filter

我编写这段代码是为了消除音频文件中的正弦波。

Fc = 40000;             %Sampling rate
F0 = 400;               %Notch frequency
Fs = Fc/2;              %Nyquist frequency
Fn = F0/Fs;             %Normalized frequency

r = 0.95;
num = [1 -2*cos(2*pi*Fn) 1];        % filter coefficients
den = [1 -2*r*cos(2*pi*Fn) r^2];    % filter coefficients

%Load original audio file
samples = [1, 5*Fc];
[clean_wav, Fc]=audioread('mustang.wav', samples);
originale_wav(:,2) = [];

%Add sine wave disturb
j = 1;
while j<(samples(2)+1),
  t(j) = j/Fc;
  j = j+1;
end; 
x=sin(2*pi*F0*t);
disturbed_wav = clean_wav' + x;

filtered_wav = filter(num,den, x);

soundsc(filtered_wav, Fc);

滤波器完全消除了正弦波。我已经尝试过不同的陷波滤波器实现,但无论如何它都不起作用。 你能帮我找出错误在哪里吗? 感谢大家的回答。

看下面的例子。它有助于在过滤前后使用 fft 查看信号的频率内容。然后你可以清楚地看到你的信号发生了什么,你过滤了什么频率。

% load a default sound
load handel.mat; % puts y and Fs in workspace
sound(y,Fs)

% Sample frequency and frequency to filter
%Fs = 8192; % from load handle.mat
F0 = 400; % frequency to filter

% time vector
t = (0:numel(y)-1).'/Fs;
% frequency vector for fft
f = 0:1/t(end):Fs;
% fft signal
Y = fft(y);

% add some sine wave with frequency F0 and small amplitude.
y_noise = y + 0.1*sin(2*pi*F0*t);

% listen to the sound
sound(y_noise, Fs)

% look at difference frequency content y and y_noise
Yn = fft(y_noise);

figure(2); clf;
plot(f,abs(Y),f,abs(Yn))


% filter
Wn = F0./Fs*2;
Q = 35;
[b,a] = iirnotch(Wn,Wn/Q);
y_filt = filter(b,a,y_noise);

% look at frequency response notch filter
freqz(b,a,[],Fs)

% fft to show frequency content filtered signal
Y_filt = fft(y_filter);

figure(3); clf;
plot(f,abs(Y),f,abs(Y_filt))

为了说明,这里是我使用的信号的频率内容,在 400 Hz 处有一个明显的尖峰:

过滤后,这个高峰明显消失了:

但是当仔细观察频率时,您会发现您也在过滤 400 Hz 左右的频率,您可以在使用 iirnotch 时使用 Q 因子进行调整(蓝色信号是原始声音的 fft,橙色是滤波信号的 fft)。