我在一维向量 X 中有一个信号,我需要去除 50Hz 及其谐振频率。我已经研究过使用fdesign.comb
,但我不确定如何在我的数据上应用该过滤器(在使用构建它之后design
)。
或者,我想我也可以这样做,iircomb
但同样,我不知道该怎么做。如果有人可以引导我完成此操作(以及如何将其应用于信号 X),我将不胜感激。
我在一维向量 X 中有一个信号,我需要去除 50Hz 及其谐振频率。我已经研究过使用fdesign.comb
,但我不确定如何在我的数据上应用该过滤器(在使用构建它之后design
)。
或者,我想我也可以这样做,iircomb
但同样,我不知道该怎么做。如果有人可以引导我完成此操作(以及如何将其应用于信号 X),我将不胜感激。
为了使用fdesign.comb
,您必须执行以下操作来指定过滤器的参数
D = fdesign.comb('notch','N,BW',8,.01);
但是您必须按照您在问题中提到的那样生成过滤器。
H = design(D); % H is a DFILT
然后您可以像这样查看过滤器
fvtool(H)
将过滤器应用于数据的一种方法是使用filter
函数
y=filter(H.Numerator,H.Denominator,inArray)
我最喜欢的设计我从未使用过的过滤器的方法是使用,fdatool
因为您可以使用所有参数。这是我的做法:
一旦您玩弄它并且看起来如您所愿,您可以导出系数或生成将创建此过滤器的代码。
导出系数
y = filter(num,den,data)
;生成代码
您在此文件中看到如下内容
Fs = 48000; % Sampling Frequency
N = 10; % Order
BW = 1200; % Bandwidth
Apass = 1; % Bandwidth Attenuation
[b, a] = iircomb(N, BW/(Fs/2), Apass);
Hd = dfilt.df2(b, a);
行iircomb
是生成滤波器系数的内容,您现在可以使用y=filter(b,a,data)
;
希望这可以帮助。
我最近需要做这样的事情!
下面是一些您可能希望用作起点的示例 Matlab 代码。. .
clear all;
%% // Make a harmonic signal and add it to another sine
sr = 44100;
dt = 1/sr;
tAxis = dt:dt:2;
freq = 50;
x = mean(sin (2*pi*freq*(1:10)'*tAxis))'; %Harmonic noise
x = x+ sin(2*pi*440*tAxis)';
%% // Fractional delay comb filter
rho = 0.95; %This sets how narrow the rejection is. Must be between 0 and 1
delay = (sr/2)/freq - 1;
N = 2*floor(delay);
%// LAGRANGE h=lagrange(N,delay) returns order N FIR
%// filter h which implements given delay
%// (in samples). For best results,
%// delay should be near N/2 +/- 1.
n = 0:N;
h = ones(1,N+1);
for k = 0:N
index = find(n ~= k);
h(index) = h(index) * (delay-k)./ (n(index)-k);
end
b = [1 -h];
a = [1 -rho*h];
nfft = 2^14;
figure; freqz(b, a, nfft, 'half', sr)
xf = filter(b,a,x);
soundsc([x; xf],sr);
该脚本生成 440 Hz 正弦波并添加 50 Hz 谐波噪声。使用分数延迟滤波器创建 50 Hz 梳状滤波器。然后使用滤波器对信号进行滤波,并在滤波过程之前和之后将输出作为声音播放。
有关更多详细信息,请尝试查看此处
http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=951433
希望这会有所帮助。