我正在寻找一些过滤噪音信号的想法。 我的抽样条件是:
我想从我的信号中提取15.84 Hz的频率。我的滤波器带宽必须非常窄。像0.01赫兹或更低。 (带通滤波器:15.83Hz至15.85Hz)
你的想法是什么?这是我的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);
感谢。
答案 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)
信号频率的不确定性与采样率除以长度成正比。因此,您需要使用更多数据,否则任何滤波器都将具有固有的更宽带宽(由于信息不确定性,假设非零噪声)。
如果您拥有足够长的信号,并希望看到开头没有延迟过滤,请尝试通过滤波器及时向后运行信号。