准确的信号过滤

时间:2015-08-29 21:42:25

标签: matlab filter signal-processing

我正在寻找一些过滤噪音信号的想法。 我的抽样条件是:

  • 频率采样率:8000 Hz
  • 信号样本数:32000字节 (约4秒)

我想从我的信号中提取15.84 Hz的频率。我的滤波器带宽必须非常窄。像0.01赫兹或更低。 (带通滤波器:15.83Hz至15.85Hz)

你的想法是什么?
我在matlab中写了FIR带通滤波器(hanning window)。但有没有想法提取精确的15.84赫兹?

这是我的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);

感谢。

3 个答案:

答案 0 :(得分:1)

假设您拥有信号处理工具箱,您似乎可以使用无数种方法来带通信号。你对波段狭窄的渴望可能在计算上是不可行的,而高阶滤波器是不稳定的,但是人们可以或多或少地收敛于中心频率。在以下示例中,我构造了一个带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);

答案 1 :(得分:0)

我不确定提取的含义...但是。这里有一些想法和一个例子,假设您希望从信号中删除某些不良频率。

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

尝试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])

答案 2 :(得分:0)

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

如果您拥有足够长的信号,并希望看到开头没有延迟过滤,请尝试通过滤波器及时向后运行信号。