# butter

Butterworth 滤波器设计

## 语法

``[b,a] = butter(n,Wn)``
``[b,a] = butter(n,Wn,ftype)``
``[z,p,k] = butter(___)``
``[A,B,C,D] = butter(___)``
``[___] = butter(___,'s')``

## 说明

``[b,a] = butter(n,Wn)` 返回归一化截止频率为 `Wn` 的 `n` 阶低通数字 Butterworth 滤波器的传递函数系数。`

``[b,a] = butter(n,Wn,ftype)` 用于根据 `ftype` 的值和 `Wn` 的元素数目，设计低通、高通、带通或带阻 Butterworth 滤波器。由此得到的带通和带阻设计的阶数都为 2`n`。注意：有关影响传递函数形成的数值问题的信息，请参阅限制。`

``[z,p,k] = butter(___)` 用于设计低通、高通、带通或带阻数字 Butterworth 滤波器，并返回其零点、极点和增益。此语法可以包含先前语法中的任何输入参数。`

``[A,B,C,D] = butter(___)` 用于设计低通、高通、带通或带阻数字 Butterworth 滤波器，并返回指定其状态空间表示的矩阵。`

``[___] = butter(___,'s')` 用于设计截止角频率为 `Wn` 的低通、高通、带通或带阻模拟 Butterworth 滤波器。`

## 示例

```fc = 300; fs = 1000; [b,a] = butter(6,fc/(fs/2)); freqz(b,a,[],fs) subplot(2,1,1) ylim([-100 20])```

```dataIn = randn(1000,1); dataOut = filter(b,a,dataIn);```

```[b,a] = butter(3,[0.2 0.6],'stop'); freqz(b,a)```

```dataIn = randn(1000,1); dataOut = filter(b,a,dataIn);```

```[z,p,k] = butter(9,300/500,'high'); sos = zp2sos(z,p,k); fvtool(sos,'Analysis','freq')```

```[A,B,C,D] = butter(10,[500 560]/750); d = designfilt('bandpassiir','FilterOrder',20, ... 'HalfPowerFrequency1',500,'HalfPowerFrequency2',560, ... 'SampleRate',1500);```

```sos = ss2sos(A,B,C,D); fvt = fvtool(sos,d,'Fs',1500); legend(fvt,'butter','designfilt')```

```n = 5; f = 2e9; [zb,pb,kb] = butter(n,2*pi*f,'s'); [bb,ab] = zp2tf(zb,pb,kb); [hb,wb] = freqs(bb,ab,4096);```

```[z1,p1,k1] = cheby1(n,3,2*pi*f,'s'); [b1,a1] = zp2tf(z1,p1,k1); [h1,w1] = freqs(b1,a1,4096);```

```[z2,p2,k2] = cheby2(n,30,2*pi*f,'s'); [b2,a2] = zp2tf(z2,p2,k2); [h2,w2] = freqs(b2,a2,4096);```

```[ze,pe,ke] = ellip(n,3,30,2*pi*f,'s'); [be,ae] = zp2tf(ze,pe,ke); [he,we] = freqs(be,ae,4096);```

```plot(wb/(2e9*pi),mag2db(abs(hb))) hold on plot(w1/(2e9*pi),mag2db(abs(h1))) plot(w2/(2e9*pi),mag2db(abs(h2))) plot(we/(2e9*pi),mag2db(abs(he))) axis([0 4 -40 5]) grid xlabel('Frequency (GHz)') ylabel('Attenuation (dB)') legend('butter','cheby1','cheby2','ellip')```

Butterworth 和 Chebyshev II 类滤波器具有平坦的通带和宽过渡带。Chebyshev I 类和椭圆滤波器转降更快，但有通带波纹。Chebyshev II 类设计函数的频率输入设置阻带的起点，而不是通带的终点。

## 输入参数

• 如果 `Wn` 是标量，则 `butter` 用于设计截止频率为 `Wn` 的低通或高通滤波器。

如果 `Wn` 是二元素向量 `[w1 w2]`，其中 `w1` < `w2`，则 `butter` 用于设计截止频率下限为 `w1` 且截止频率上限为 `w2` 的带通或带阻滤波器。

• 对于数字滤波器，截止频率必须介于 0 与 1 之间，其中 1 对应于奈奎斯特速率（即采样率的一半）或 π 弧度/采样点。

对于模拟滤波器，截止频率必须用弧度/秒表示，并且可以取任何正值。

• `'low'` 指定截止频率为 `Wn` 的低通滤波器。`'low'` 是标量 `Wn` 的默认值。

• `'high'` 指定截止频率为 `Wn` 的高通滤波器。

• 如果 `Wn` 是二元素向量，则 `'bandpass'` 指定阶数为 2`n` 的带通滤波器。当 `Wn` 有两个元素时，`'bandpass'` 是默认值。

• 如果 `Wn` 是二元素向量，则 `'stop'` 指定阶数为 2`n` 的带阻滤波器。

## 输出参数

• 对于数字滤波器，传递函数用 `b``a` 表示为

`$H\left(z\right)=\frac{B\left(z\right)}{A\left(z\right)}=\frac{\text{b(1)}+\text{b(2)}\text{\hspace{0.17em}}{z}^{-1}+\cdots +\text{b(n+1)}\text{\hspace{0.17em}}{z}^{-n}}{\text{a(1)}+\text{a(2)}\text{\hspace{0.17em}}{z}^{-1}+\cdots +\text{a(n+1)}\text{\hspace{0.17em}}{z}^{-n}}.$`

• 对于模拟滤波器，传递函数用 `b``a` 表示为

`$H\left(s\right)=\frac{B\left(s\right)}{A\left(s\right)}=\frac{\text{b(1)}\text{\hspace{0.17em}}{s}^{n}+\text{b(2)}\text{\hspace{0.17em}}{s}^{n-1}+\cdots +\text{b(n+1)}}{\text{a(1)}\text{\hspace{0.17em}}{s}^{n}+\text{a(2)}\text{\hspace{0.17em}}{s}^{n-1}+\cdots +\text{a(n+1)}}.$`

• 对于数字滤波器，传递函数用 `z``p``k` 表示为

`$H\left(z\right)=\text{k}\frac{\left(1-\text{z(1)}\text{\hspace{0.17em}}{z}^{-1}\right)\text{\hspace{0.17em}}\left(1-\text{z(2)}\text{\hspace{0.17em}}{z}^{-1}\right)\cdots \left(1-\text{z(n)}\text{\hspace{0.17em}}{z}^{-1}\right)}{\left(1-\text{p(1)}\text{\hspace{0.17em}}{z}^{-1}\right)\text{\hspace{0.17em}}\left(1-\text{p(2)}\text{\hspace{0.17em}}{z}^{-1}\right)\cdots \left(1-\text{p(n)}\text{\hspace{0.17em}}{z}^{-1}\right)}.$`
• 对于模拟滤波器，传递函数用 `z``p``k` 表示为

`$H\left(s\right)=\text{k}\frac{\left(s-\text{z(1)}\right)\text{\hspace{0.17em}}\left(s-\text{z(2)}\right)\cdots \left(s-\text{z(n)}\right)}{\left(s-\text{p(1)}\right)\text{\hspace{0.17em}}\left(s-\text{p(2)}\right)\cdots \left(s-\text{p(n)}\right)}.$`

• 对于数字滤波器，状态空间矩阵与状态向量 x、输入 u 和输出 y 存在以下关系

`$\begin{array}{c}x\left(k+1\right)=\text{A}\text{\hspace{0.17em}}x\left(k\right)+\text{B}\text{\hspace{0.17em}}u\left(k\right)\\ y\left(k\right)=\text{\hspace{0.17em}}\text{\hspace{0.17em}}\text{C}\text{\hspace{0.17em}}x\left(k\right)+\text{D}\text{\hspace{0.17em}}u\left(k\right).\end{array}$`

• 对于模拟滤波器，状态空间矩阵通过以下方程将状态向量 x、输入 u 和输出 y 相关

`$\begin{array}{l}\stackrel{˙}{x}=\text{A}\text{\hspace{0.17em}}x+\text{B}\text{\hspace{0.17em}}u\\ y=\text{C}\text{\hspace{0.17em}}x+\text{D}\text{\hspace{0.17em}}u.\end{array}$`

## 详细信息

### 限制

```n = 6; Wn = [2.5e6 29e6]/500e6; ftype = 'bandpass'; % Transfer Function design [b,a] = butter(n,Wn,ftype); % This is an unstable filter % Zero-Pole-Gain design [z,p,k] = butter(n,Wn,ftype); sos = zp2sos(z,p,k); % Display and compare results hfvt = fvtool(b,a,sos,'FrequencyScale','log'); legend(hfvt,'TF Design','ZPK Design')```

## 算法

Butterworth 滤波器的幅值响应在通带内具有最大平坦度，并在整体上呈现单调性。这种平滑是以降低滚降陡度为代价的。对于给定滤波器阶数，椭圆和 Chebyshev 滤波器通常提供更陡的滚降。

`butter` 使用一个五步算法：

1. 它使用函数 `buttap` 查找低通模拟原型的极点、零点和增益。

2. 它将极点、零点和增益转换为状态空间形式。

3. 如果需要，它使用状态空间变换将低通滤波器转换为具有所需频率约束的带通、高通或带阻滤波器。

4. 对于数字滤波器设计，它使用 `bilinear` 通过具有频率预修正的双线性变换将模拟滤波器转换为数字滤波器。经过仔细调整频率，模拟滤波器和数字滤波器在 `Wn``w1``w2` 处可具有相同的频率响应幅值。

5. 根据需要，它将状态空间滤波器转换回其传递函数或零极点增益形式。