用陷波滤波器不能消除正弦波
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)。
我编写这段代码是为了消除音频文件中的正弦波。
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)。