【问题标题】:Designing a narrow bandpass filter in MATLAB在 MATLAB 中设计一个窄带通滤波器
【发布时间】:2016-08-20 21:08:15
【问题描述】:

我正在研究 MATLAB 中的信号过滤。我写了一个具有 3 个不同频率的信号:

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);

现在我想使用汉宁窗通过带通窗滤波提取 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)))

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

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

如果我的采样率为 8000Hz,而我只能缓冲 20000 个样本,那么如何设计一个窄带通滤波器

【问题讨论】:

  • 这是一个荒谬的自然通带。您检查过滤波器的频率响应吗?
  • 是的,过滤响应没问题,我发现了一个有趣的点!当我将 49Hz 和 51Hz 信号的幅度减小到 10(从 500)时,一切正常!为什么?!
  • 还有一点!与其他信号密切相关的滤波信号的最大幅度! (49Hz和51Hz)反之,如果49Hz信号幅度增长到2000,(从500),滤波结果幅度一直在增长!!!但主信号(50Hz)幅度是固定的!我要疯了!!!!!!
  • 使用 fvtool(Hd) 检查过滤器。你会看到你的过滤器大约是。 -1dB @ 49Hz 和 51Hz,这可能不是你想要的。
  • 是的!你说得对,但我不能增加过滤器的顺序。如果我将过滤器阶数增加到 65536,结果会有所改善。但是我无法更改过滤器顺序,还有其他方法可以提高过滤器性能吗?另一个问题是为什么其他信号幅度对主信号(50hz)影响很大?我怎样才能减少这种影响?

标签: matlab filtering signal-processing


【解决方案1】:

所以,我通过降低采样率和增加样本数据来解决问题:(正如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
....

这对我来说是一个很好的结果,过滤后的信号是:

但是有一些问题:

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

2- 15 Hz 信号的最佳采样率是多少?

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多