如何在 MatLAB/Octave 中创建 1/3 倍频程滤波器
How to create 1/3-Octave-Band Filters in MatLAB/Octave
我必须在 MatLAB(或 Octave)中设计 1/3 倍频程滤波器。我已阅读 this 文档文章并尝试使用 fdesign.octave
-design
duo,但此方法允许为从 25Hz 左右开始的中频带频率创建带滤波器。我需要为 0.5Hz 到 100Hz 的频率范围创建滤波器。
我知道如何计算这些滤波器的中频带频率 (fm) 以及相应的上限和下限频率,所以我尝试使用 butter
或 cheby1
函数或使用fdatool
。虽然 fdatool
中的过滤器 created/displayed 看起来不错,但当我使用它们使用 filer
函数过滤 chirp
信号时,我可以看到如下图所示的内容:
顶部图是使用我的自定义过滤器 chirp
过滤的,底部图显示相同的 chirp
使用相同阶数、类型和中频的过滤器过滤,但使用 fdesign.octave
-design
二人组。我不知道如何去掉一开始的那个信号增益,这个实际上是最低的信号增益之一,显示为 100hZ 中频。中频越低,我的滤波器越差(实际上,低于 2 或 3 Hz,我的滤波器会过滤掉所有东西)。
她的是我用来构建过滤器的代码:
Wn = [Fl(i) Fh(i)] / (Fs/2);
[ z, p, k ] = butter( N, Wn, 'bandpass' );
% [z,p,k] = cheby1( N, Rp, Wn, 'bandpass' );
[ sos, g ]=zp2sos( z, p, k );
f = dfilt.df2sos( sos, g );
谁能帮我设计适合该频率范围 (0.5÷100)Hz 的 1/3 倍频程滤波器?
编辑:
我找到了另一种方法来使用标准化 fdesign.octave
方法来做我想做的事情。阅读下面我的回答。
只需手动计算出您想要的中心频率,然后计算上限和下限即可。以下演示使用简单的 butterworth
过滤器,但您可以将其替换为您喜欢的任何原型。
fs = 250;
bw = 1/3;
fMin = 0.5;
fMax = 100;
octs = log2(fMax/fMin);
bmax = ceil(octs/bw);
fc = fMin*2.^( (0:bmax) * bw ); % centre frequencies
fl = fc*2^(-bw/2); % lower cutoffs
fu = fc*2^(+bw/2); % upper cutoffs
numBands = length(fc);
b = cell(numBands,1);
a = cell(numBands,1);
figure
for nn = 1:length(fc)
[b{nn},a{nn}] = butter(2, [fl(nn) fu(nn)]/(fs/2), 'bandpass');
[h,f]=freqz(b{nn},a{nn},1024,fs);
hold on;
plot(f, 20*log10(abs(h)) );
end
set(gca, 'XScale', 'log')
ylim([-50 0])
这给。 . .
如果您希望高阶滤波器的稳定性作为二阶部分的级联,则可以使用 tf2sos
。
您可以使用以下代码来测试 chirp 以查看没有发生任何异常情况。 .
dt=1/fs;
t = 0:dt:2000; % 2 seconds
fo = 0.5; f1 = 120;
x = chirp(t,fo,numel(t)*dt,f1,'logarithmic')';
y = zeros(numel(x), length(fc));
for nn = 1:length(fc)
y(:,nn) = filter(b{nn},a{nn},x);
end
figure; plot(y)
虽然我已经接受了 learnvst 的回答(因为它在开始时对我有一点帮助),但后来我找到了其他方法来创建正确的过滤器,它符合 ANSI S1.11 / IEC 61260,它实际上是很简单。我的想法是基于特定的 属性 数字滤波器,即它们可以用于与设计时不同采样率的信号,这将导致改变滤波器的实际通带范围。
我使用了标准化的 fdesign.octave
方法,但参数值不同。对于 (25÷100)Hz 范围的中频带频率,我按照正常方式进行了所有操作,但对于从 2.5Hz 左右开始(最高 24Hz)的范围,我指定了 10 倍大的采样率和 10 倍大的中频带频率。对于 0.5Hz 及以上 (<2.5Hz) 的频率,我将这些值乘以 100。因此,对于源信号的实际采样率,我获得了 (0.5÷100)Hz 范围内的有效滤波器。
我必须在 MatLAB(或 Octave)中设计 1/3 倍频程滤波器。我已阅读 this 文档文章并尝试使用 fdesign.octave
-design
duo,但此方法允许为从 25Hz 左右开始的中频带频率创建带滤波器。我需要为 0.5Hz 到 100Hz 的频率范围创建滤波器。
我知道如何计算这些滤波器的中频带频率 (fm) 以及相应的上限和下限频率,所以我尝试使用 butter
或 cheby1
函数或使用fdatool
。虽然 fdatool
中的过滤器 created/displayed 看起来不错,但当我使用它们使用 filer
函数过滤 chirp
信号时,我可以看到如下图所示的内容:
顶部图是使用我的自定义过滤器 chirp
过滤的,底部图显示相同的 chirp
使用相同阶数、类型和中频的过滤器过滤,但使用 fdesign.octave
-design
二人组。我不知道如何去掉一开始的那个信号增益,这个实际上是最低的信号增益之一,显示为 100hZ 中频。中频越低,我的滤波器越差(实际上,低于 2 或 3 Hz,我的滤波器会过滤掉所有东西)。
她的是我用来构建过滤器的代码:
Wn = [Fl(i) Fh(i)] / (Fs/2);
[ z, p, k ] = butter( N, Wn, 'bandpass' );
% [z,p,k] = cheby1( N, Rp, Wn, 'bandpass' );
[ sos, g ]=zp2sos( z, p, k );
f = dfilt.df2sos( sos, g );
谁能帮我设计适合该频率范围 (0.5÷100)Hz 的 1/3 倍频程滤波器?
编辑:
我找到了另一种方法来使用标准化 fdesign.octave
方法来做我想做的事情。阅读下面我的回答。
只需手动计算出您想要的中心频率,然后计算上限和下限即可。以下演示使用简单的 butterworth
过滤器,但您可以将其替换为您喜欢的任何原型。
fs = 250;
bw = 1/3;
fMin = 0.5;
fMax = 100;
octs = log2(fMax/fMin);
bmax = ceil(octs/bw);
fc = fMin*2.^( (0:bmax) * bw ); % centre frequencies
fl = fc*2^(-bw/2); % lower cutoffs
fu = fc*2^(+bw/2); % upper cutoffs
numBands = length(fc);
b = cell(numBands,1);
a = cell(numBands,1);
figure
for nn = 1:length(fc)
[b{nn},a{nn}] = butter(2, [fl(nn) fu(nn)]/(fs/2), 'bandpass');
[h,f]=freqz(b{nn},a{nn},1024,fs);
hold on;
plot(f, 20*log10(abs(h)) );
end
set(gca, 'XScale', 'log')
ylim([-50 0])
这给。 . .
如果您希望高阶滤波器的稳定性作为二阶部分的级联,则可以使用 tf2sos
。
您可以使用以下代码来测试 chirp 以查看没有发生任何异常情况。 .
dt=1/fs;
t = 0:dt:2000; % 2 seconds
fo = 0.5; f1 = 120;
x = chirp(t,fo,numel(t)*dt,f1,'logarithmic')';
y = zeros(numel(x), length(fc));
for nn = 1:length(fc)
y(:,nn) = filter(b{nn},a{nn},x);
end
figure; plot(y)
虽然我已经接受了 learnvst 的回答(因为它在开始时对我有一点帮助),但后来我找到了其他方法来创建正确的过滤器,它符合 ANSI S1.11 / IEC 61260,它实际上是很简单。我的想法是基于特定的 属性 数字滤波器,即它们可以用于与设计时不同采样率的信号,这将导致改变滤波器的实际通带范围。
我使用了标准化的 fdesign.octave
方法,但参数值不同。对于 (25÷100)Hz 范围的中频带频率,我按照正常方式进行了所有操作,但对于从 2.5Hz 左右开始(最高 24Hz)的范围,我指定了 10 倍大的采样率和 10 倍大的中频带频率。对于 0.5Hz 及以上 (<2.5Hz) 的频率,我将这些值乘以 100。因此,对于源信号的实际采样率,我获得了 (0.5÷100)Hz 范围内的有效滤波器。