我正在研究 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 个样本,如何设计一个窄带通滤波器?
因此,我通过降低采样率并通过此代码增加样本数据来解决问题:(如 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 信号的最佳采样率是多少?
谢谢。
我是一名优秀的程序员,十分优秀!