精确的信号过滤

Accurate Signal Filtering

我正在寻找一些想法来过滤嘈杂的信号。 我的采样条件是:

我想从我的信号中提取 15.84 Hz 频率。我的滤波器带宽一定很窄。例如 0.01 Hz 或更低。 (带通滤波器:15.83Hz 至 15.85Hz)

你的想法是什么?
我在 matlab 中编写了 FIR 带通滤波器 ( hanning window )。但是有什么想法可以更好地提取精确的 15.84 Hz 吗?

这是我的 matlab 代码:

function Hd = hannigfilter
% FIR Window Bandpass filter designed using the FIR1 function.
% All frequency values are in Hz.
Fs = 8000;  % Sampling Frequency
N    = 4 * 4096;     % Order   -> for accurate filtering
Fc1  = 15.83;    % First Cutoff Frequency
Fc2  = 15.85;    % Second Cutoff Frequency
flag = 'scale';  % Sampling Flag
% Create the window vector for the design algorithm.
win = hann(N+1);

% Calculate the coefficients using the FIR1 function.
b  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);

和:

band_passed_signal = filter(Hd.Numerator,1,mySignal);

谢谢。

假设您拥有信号处理工具箱(您似乎拥有),那么有无数种方法可以带通信号。您对频带变窄的期望在计算上可能不可行,并且高阶滤波器不稳定,但可以或多或少地收敛在中心频率上。在下面的示例中,我构造了一个 butter() 的四阶带通滤波器。我用白噪声测试了它,它似乎工作正常。这里Y是起始信号,newY是输出。请注意,butter() 带通滤波器的阶数是第一个参数的两倍,这与低通或高通调用不同,这就是 filterOrder 为 2 的原因。如果您认为有必要,可以执行相同的操作在对 butter().

的调用中,滤波器带宽再次在输出上小一个数量级
fs=8000;
nyquist=fs/2;
CF=15.84;
filterOrder=2;

[b,a]=butter(filterOrder,[CF-.01 CF+.01]/nyquist);
newY=filter(b,a,Y);

我不确定 extract 是什么意思...但是。这里有一些想法和示例,假设您想要从信号中 删除 一些不需要的频率。

如果您的目标是提取 一些频率,您不需要带通滤波器,而是陷波 滤波器。带通与提取相反。

尝试iirnotch

下面的示例创建了一个具有两个音调和加性噪声的信号。然后它使用 iirnotch 来获取从信号中移除第二个音调的系数。

fs=8000;
N=32000;
n=(0:N-1)/fs;
x = 5*sin(2*pi*200*n)+2*sin(2*pi*600*n)+randn(1,N);
X=fft(x);
f=(-N/2:N/2-1)*fs/N
plot(f, fftshift(10*log10(X.*conj(X))))
xlim([0,1000])
ylim([40,100])
w0=600/(0.5*fs)
q=35;
[b,a]=iirnotch(w0,w0/q);
y=filter(b,a,x);
Y=fft(y);
plot(f, fftshift(10*log10(Y.*conj(Y))))
xlim([0,1000])
ylim([40,100])

信号频率的不确定性与采样率除以长度成正比。因此,您要么需要使用更多数据,要么任何滤波器都将具有更宽的固有带宽(由于信息的不确定性,假设噪声为非零)。

如果您有一个足够长的信号并且希望立即看到开始过滤,请尝试运行通过过滤器及时倒退信号。