在MATLAB中设计一个窄带通滤波器

问题描述:

我正在MATLAB中进行信号滤波。我写的信号与3个不同的频率:在MATLAB中设计一个窄带通滤波器

Fs = 8000;     %// Sampling frequency 
T = 1/Fs;     %// Sample time 
L = 16000;     %// Length of signal 
t = (0:L-1)*T;    %// Time vector 

y = 40*sin(2*pi*50*t) + 500*sin(2*pi*51*t) + 500*sin(2*pi*49*t); 

Signal y

现在我想提取通过使用汉宁窗的带通滤波窗口50Hz的信号。
这里是我的代码设计滤波器:

function Hd = HannFilter1 

Fs = 8000;   %// Sampling Frequency 

N = 4096;  %// Order 
Fc1 = 49.5;  %// First Cutoff Frequency 
Fc2 = 50.5;  %// Second Cutoff Frequency 
flag = 'scale'; %// Sampling Flag 
win = hann(N+1); 

b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag); 
Hd = dfilt.dffir(b); 

在那之后,我就用filter这样的过滤:

yfilter = filter(Hd.Numerator,1,y); 

NFFT = 2^nextpow2(L); 
Y = fft(yfilter,NFFT)/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 

figure; 
subplot(2,1,1); 
plot(yfilter); 
subplot(2,1,2); 
plot(f,2*abs(Y(1:NFFT/2+1))) 

filtered Signal

  • 为什么这个过滤器无法提取50Hz信号?
  • 我在这个模拟中做错了什么?
  • 如何滤除50Hz信号?

什么是50Hz信号的最佳采样率?和非常重要的问题!在现实世界中,像平衡系统一样,主信号大约是20Hz,环境噪声太大,我的解决方案过滤并不能给出正确的答案。在这种情况下,我如何使用或选择最佳的过滤算法?

如果我采样率是8000Hz的,我可以缓冲只有20000样品,怎么能设计一个窄带滤光片

+0

这是一个荒谬的自然通带。你有没有检查过滤器的频率响应? –

+0

是的,过滤器的响应是好的,有一个有趣的点,我发现它!当我把49Hz和51Hz信号的幅度降低到10(从500)时,每件事情都很好!为什么?! –

+0

还有一个点!与其他信号强烈相关的滤波信号幅度的最大值! (49Hz和51Hz)如果49Hz信号的幅值增长到2000,(从500),滤波结果幅度一直在增长!但主信号(50Hz)的幅度是固定的!我要疯了!!!!! –

所以,我解决通过减少采样率的问题,通过该代码增加采样数据:(如Matt据说)

Fs = 1000;     % Sampling frequency 
T = 1/Fs;      % Sample time 
L = 60000;      % Length of signal 
t = (0:L-1)*T;    % Time vector 

for j=1:20 

r1 = 5 + (1000-5).*rand(1,1); 
r2 = 5 + (1000-5).*rand(1,1); 

y = 10*sin(2*pi*14.8*t) + r1*sin(2*pi*14.2*t) + r2*sin(2*pi*15.5*t) + 1.1*rand(size(t)); 


yfilter = filter(Hd.Numerator,1,y); 
max(yfilter(40000:50000)) 

end 

我的过滤器是KAISER(FIR Badpass滤波器):

Fs = 1000; % Sampling Frequency 

Fstop1 = 14.2;   % First Stopband Frequency 
Fpass1 = 14.6;   % First Passband Frequency 
Fpass2 = 15;    % Second Passband Frequency 
Fstop2 = 15.2;   % Second Stopband Frequency 
Dstop1 = 1e-06;   % First Stopband Attenuation 
Dpass = 0.057501127785; % Passband Ripple 
Dstop2 = 1e-06;   % Second Stopband Attenuation 
flag = 'scale';   % Sampling Flag 

% Calculate the order from the parameters using KAISERORD. 
[N,Wn,BETA,TYPE] = kaiserord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 ... 
          1 0], [Dstop1 Dpass Dstop2]); 

% Calculate the coefficients using the FIR1 function. 
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag); 
Hd = dfilt.dffir(b); 

,滤波幅度为20次迭代,随机噪声信号为:

max(yfilter(40000:50000)) 

10.01 
10.02 
10.01 
10.00 
10.01 
10.03 
10.01 
10.02 
.... 

这是一个伟大的结果对我来说,和滤波后的信号是: Filtered Signal

,但有一些问题:

1 - 我的样本的数据长度为60000个字节,在另一方面通过在1000Hz的采样率,我等待60秒收集数据,这是太长时间了! 当我减少样本数据长度约3000样本,过滤结果是如此糟糕,因为过滤器的系数是约4097. 如何过滤我的信号,当它的长度为3000个样本,我的过滤器的系数约为4097字节?当我减少滤波器的系数时,滤波后的信号结果非常嘈杂。

2-什么是15 Hz信号的最佳采样率?

谢谢。