2026a

# bandstop


带阻滤波器信号

函数库: TySignalProcessing

# 语法

y = bandstop(x,wpass)
y = bandstop(x,fpass,fs)

y = bandstop(___,Name=Value)

y,b  = bandstop(___)

bandstop(; plotfig=true)

# 说明

y = bandstop(x,wpass) 使用带阻滤波器对输入信号 x 进行滤波,其阻带频率范围由二元素向量 wpass 指定,并以 的归一化单位表示。 带阻使用阻带衰减为 60 dB 的最小阶滤波器,并补偿滤波器引入的延迟。 如果 x 是矩阵,则该函数独立对每一列进行滤波。


y = bandstop(x,fpass,fs) 指定 x 已以 fs Hz 的速率进行采样。 二元素向量 fpass 以 Hz 为单位指定滤波器的阻带频率范围。


y = bandstop(___,Name=Value) 使用名称-值参数对为上述任何语法指定附加选项。 您可以更改阻带衰减、过渡带陡度和滤波器的脉冲响应类型。


y,b = bandstop(___) 还返回用于滤波输入的 digitalFilter 对象 b。


bandstop(; plotfig=true) 绘制输入信号,并叠加滤波后的信号。

# 示例

音调的带阻滤波

创建一个以 1 kHz 频率采样的信号,持续 1 s。信号包含三个音调,一个为 50 Hz,另一个为 150 Hz,第三个为 250 Hz。高频和低频音调的振幅都是中间音调的两倍。信号内含方差为 1/100 的高斯白噪声。

using TyPlot
using TySignalProcessing
using TyMath

rng = MT19937ar(1234)
fs = 1e3;
t = 0:(1 / fs):1;
x =
    [2 1 2] * sin.(2 * pi * collect([50 150 250]') * collect(t')) .+
    collect((randn(rng, size(t)) ./ 10)')

对信号进行带阻滤波,去除中频音。指定通带频率为 100 Hz 和 200 Hz。显示原始信号和滤波信号,以及它们的频谱。

x = x[:]
y, b = bandstop(x, [100 200], fs; plotfig=true)
带阻滤波器的陡度

使用具有 100 Hz 阻带宽度的无限冲激响应带阻滤波器对 1 kHz 采样的白噪声进行滤波。使用不同的陡度值,绘制滤波信号的频谱。

using TyPlot 
using TySignalProcessing
using TyMath
using TyControlSystems
rng = MT19937ar(1234)
fs = 1000
x = randn(rng,20000, 1)

y1, d1 = bandstop(x, [50 150], fs, ImpulseResponse = "iir", Steepness = 0.5)
y2, d2 = bandstop(x, [200 300], fs, ImpulseResponse = "iir", Steepness = 0.8)
y3, d3 = bandstop(x, [350 450], fs, ImpulseResponse = "iir", Steepness = 0.95)

h1, f = freqz(d1, 1024, fs)
h2, = freqz(d2, 1024, fs)
h3, = freqz(d3, 1024, fs)

plot(f, mag2db.(abs.([h1 h2 h3])))
ylim([-100, 1])
legend(["Steepness = 0.5", "Steepness = 0.8", "Steepness = 0.95"]; loc="south")
音乐信号的带阻滤波

实现一个基本的数字音乐合成器,并用它来播放一首传统歌曲。指定采样率为 2 kHz。绘制歌曲的频谱图。

using TySignalProcessing
fs = 2e3;
t = 0:1/fs:0.3-1/fs;

l = [0 130.81 146.83 164.81 174.61 196.00 220 246.94];
m = [0 261.63 293.66 329.63 349.23 392.00 440 493.88];
h = [0 523.25 587.33 659.25 698.46 783.99 880 987.77];

mel = [3 2 1 2 3 3 3 0 2 2 2 0 3 5 5 0 3 2 1 2 3 3 3 3 2 2 3 2 1].+1
acc = [3 0 5 0 3 0 3 3 2 0 2 2 3 0 5 5 3 0 5 0 3 3 3 0 2 2 3 0 1].+1

kj = 1;
f = mel[kj]
g = acc[kj]
x = [1 1 1]*sin.(2*pi*[l[g] m[g] h[f]]'.*reshape(t,(1,600)))
song = [x zeros(1,Int(0.01*fs))]
for kj = 2:length(mel)
    global f = mel[kj]
    global g = acc[kj]
    global x = [1 1 1]*sin.(2*pi*[l[g] m[g] h[f]]'.*reshape(t,(1,600)))
    global song = [song x zeros(1,Int(0.01*fs))]
end
y, = findmax(abs.(song))
song = song./(y+0.1)

对信号进行带阻滤波,将中间寄存器与其他两个寄存器分开。指定通带频率为 230 Hz 和 450 Hz。绘制原始信号和滤波信号的时域和频域图。

pong, = bandstop(song,[230 450],fs)

bandstop(song,[230 450],fs; plotfig=true)

# 输入参数

x - 输入信号
向量 | 矩阵

输入信号,指定为向量或矩阵。

数据类型: Float

复数支持:

wpass - 归一化阻带频率范围
元素在 (0, 1) 中的二元素向量

归一化阻带频率范围,指定为元素在区间 (0, 1) 中的二元素向量。

fpass - 阻带频率范围
元素在 (0, fs/2) 中的二元素向量

阻带频率范围,指定为二元素向量,其元素在区间 (0, fs/2) 中。

fs - 采样率
正实标量

采样率,指定为正实标量。

# 名称-值参数对

指定可选的名称-值参数对。 Name 是参数名称,Value 是对应的值。

示例: y, = bandstop(___,ImpulseResponse = "iir", Steepness = 0.5,StopbandAttenuation=50)

ImpulseResponse - 脉冲响应的类型
"auto" (默认) | "fir" | "iir"

滤波器的脉冲响应类型,取"fir"、"iir"、"auto"。

  • "fir" - 该函数设计一个最小阶、线性相位、有限脉冲响应 (FIR) 滤波器。为了补偿延迟,该函数附加到输入信号 N/2 个零,其中 N 是滤波器阶数。然后该函数进行信号滤波并删除输出的前 N/2 个样本;

    在这种情况下,输入信号的长度必须至少是符合规格的滤波器的两倍。

  • "iir" - 该函数设计最小阶无限脉冲响应 (IIR) 滤波器,并使用 filtfilt 函数执行零相位滤波并补偿滤波器延迟;

    如果信号的长度不是满足规格的滤波器的至少三倍,则该函数会设计一个阶数更小的滤波器,从而使陡度更小。

  • "auto" - 如果输入信号足够长,该函数设计一个最小阶 FIR 滤波器,否则设计一个最小阶 IIR 滤波器。具体来说,该函数遵循以下步骤:

    1. 计算 FIR 滤波器必须满足规范的最小阶数。如果信号至少是所需滤波器阶数的两倍,请设计并使用该滤波器;

    2. 如果信号不够长,请计算 IIR 滤波器必须满足规范的最小阶数。如果信号至少是所需滤波器阶数的三倍,请设计并使用该滤波器;

    3. 如果信号不够长,则将阶数截断为信号长度的三分之一,并设计该阶数的 IIR 滤波器。顺序的减少是以过渡带陡度为代价的;

    4. 进行信号滤波并补偿延迟。

Steepness - 过渡带陡度
0.85(默认)| 区间 [0.5, 1) 中的标量

过渡带陡度,取区间 [0.5, 1) 中的标量。 随着陡度的增加,滤波器响应接近理想的带阻响应,但由此产生的滤波器长度和滤波操作的计算成本也会增加。

StopbandAttenuation - 滤波器阻带衰减
60(默认)| 以 dB 为单位的正标量

滤波器阻带衰减,取一个以 dB 为单位的正标量。

# 输出参数

y - 滤波后的信号
向量 | 矩阵 | 时间表

滤波后的信号,以与输入具有相同维度的向量、矩阵或时间表形式返回。

b - 带阻滤波器
数字滤波器对象

滤波操作中使用的带阻滤波器,作为结构体对象返回。

# 更多

带阻滤波器陡度

"Steepness" 参数控制滤波器过渡区域的宽度。 陡度越低,过渡区域越宽。 陡度越高,过渡区域越窄。

要解释滤波器陡度,请考虑以下定义:

  • 奈奎斯特频率 (Nyquist frequency), fNyquist 是信号的最高频率分量,它可以以给定的速率进行采样而不会产生混叠。 当输入信号没有时间信息时, 为 1 (×π rad/sample),当输入信号为时间表或指定采样率时, Hz;

  • 滤波器的下阻带频率和上阻带频率 是低于和高于其衰减等于或大于使用 "StopbandAttenuation" 指定的值的频率;

    阻带区域的中心是

  • 滤波器的下过渡宽度 ,其中较低的带阻频率 的第一个元素;

  • 滤波器 的上过渡宽度为 ,其中较高的带阻频率 的第二个元素;

  • 大多数非理想滤波器也会衰减整个通带的输入信号。 这种频率相关衰减的最大值称为通带纹波。 带阻使用的每个滤波器都有 0.1 dB 的通带纹波。

要控制过渡带的宽度,您可以将 "Steepness" 指定为二元素向量 或标量。 当您将 "Steepness" 指定为向量时,函数:

  • 计算下过渡宽度为:

    • 当 "Steepness" 的第一个元素等于 0.5 时,过渡宽度为 的 50%。

    • 随着 "Steepness" 的第一个元素接近 1,过渡宽度逐渐变窄,直到达到最小值 的 1%。

  • 计算上过渡宽度为:

    • 当 "Steepness" 的第二个元素等于 0.5 时,过渡宽度为 的 50%。

    • 随着 "Steepness" 的第二个元素接近 1,过渡宽度逐渐变窄,直到达到 的最小值 1%。

当您将 "Steepness" 指定为标量时,该函数会设计一个具有相等上下过渡宽度的滤波器。"Steepness" 的默认值为 0.85。

# 另请参阅

bandpass | highpass | lowpass