【问题标题】:Accurate Signal Filtering精确的信号过滤
【发布时间】:2015-08-29 21:42:25
【问题描述】:

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

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

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

你的想法是什么?
我在 matlab 中写了 FIR 带通滤波器(汉宁窗)。但是有什么办法可以更好地提取准确的 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);

谢谢。

【问题讨论】:

  • 我投票结束这个问题,因为它是关于信号处理的,而不是关于编程的。 dsp.stackexchange.com 是正确的提问地点。
  • 我觉得你太死板了。 matlab 本质上是一种技术计算语言,而不是编程语言。算法和实现之间的界限通常很模糊。

标签: matlab filter signal-processing


【解决方案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);

【讨论】:

  • 谢谢Karl,我以前用过同样的方法,但是我的数据长度太小了。我在我的程序中添加了您的代码,您可以在我上传的打击图像链接中看到它的结果。过滤器延迟太长。请看滤波器信号幅度。 Signal Filter Image Link
【解决方案2】:

我不确定您所说的 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])

【讨论】:

  • 谢谢拥挤的Computeeer,但我的信号太吵了,我想得到一个像15.84Hz这样的频率。另一方面,我想如果我想使用你的代码,我必须删除除 15.84Hz 之外的所有频率。正如我所说,我的信号太吵了。请看我信号的fft。 Signal Filtering Image
【解决方案3】:

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

如果您有一个足够长的信号,并且希望看到开始被无延迟地过滤,请尝试通过过滤器及时向后运行信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多