我尝试模拟有噪声的信号并对其进行过滤。信号混合了一些低频信号和一些随机噪声。我的目标是获得14.8Hz的信号。 我的带通带宽是14.7Hz到14.9Hz。
function filteringTest
Hd = KaiserFilter;
Fs = 4000; % Sampling frequency
T = 1/Fs; % Sample time
L = 40000; % Length of signal
t = (0:L-1)*T; % Time vector
r1 = 320;
r2 = 575;
y = 50*sin(2*pi*14.8*t) + r1*sin(2*pi*14.7*t) + r2*sin(2*pi*15.1*t) + 10.1*rand(size(t));
yfilter = filter(Hd.Numerator,1,y);
plot(yfilter)
function Hd = KaiserFilter
Fs = 4000; % Sampling Frequency
N = 4096; % Order
Fc1 = 14.7; % First Cutoff Frequency
Fc2 = 14.9; % Second Cutoff Frequency
flag = 'scale'; % Sampling Flag
Beta = 0.5; % Window Parameter
% Create the window vector for the design algorithm.
win = kaiser(N+1, Beta);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);
当我尝试将过滤器顺序从4096增加到32 * 4096时,我得到以下结果:
为什么这个过滤器不能正常工作?我是否采用了我的过滤方法? 我该怎么做才能获得14.8Hz的频率信号?
感谢。
答案 0 :(得分:1)
为什么您的采样率如此之高?降低采样率并使用陷波滤波器来选择频率。我重新编写了代码的一些部分:
Fs = 200;
desiredFrequency = 14.8;
[b,a] = NotchFilter(Fs, desiredFrequency)
在过滤器定义中,您可以执行以下操作:
function [b,a] = NotchFilter(Fs,desiredFrequency)
w = desiredFrequency/(Fs/2);
[b,a] = iirnotch(w,w/400);
现在执行过滤
y_filter = filtfilt(b,a,y);
desiredSignal = y-y_filter;
plot(desiredSignal,'LineWidth',2); hold on; plot(y,'LineWidth',2)
你会看到类似的东西。