Butterworth低通滤波器

Butterworth LPF


公式

利用一下方程得到一个和图像相同尺寸的滤波器HHH,进行滤波:

H(u,v)=11+(D(u,v)D0)2n H(u, v) = \frac{1}{1 + (\frac{D(u, v)}{D_0})^{2n}} H(u,v)=1+(D0D(u,v))2n1

其中D0D_0D0是一个常数,我们称为截止频率
D(u, v)定义如下:

D(u,v)=[(u−M2)2+(v−N2)2]12 D(u, v) = [(u - \frac{M}{2})^2 + (v - \frac{N}{2})^2]^{\frac{1}{2}} D(u,v)=[(u2M)2+(v2N)2]21

即在频率域中的点距离中心的距离。(通过对空域做中心变换后,我们在经过快速傅里叶变换之后得到的图像的中心将会是(M2,N2)(\frac{M}{2}, \frac{N}{2})(2M,2N),中心变换操作可以通过和(−1)x+y(-1)^{x + y}(1)x+y做相关得到,可以通过傅里叶变换的平移性得到)

matlab步骤

(1)以(−1)(x+y)(-1)^{(x + y)}(1)(x+y) 乘以输入图像进行中心变换;

% uint8
f = imread('your_image_file');
% double
f = im2double(f);
[X, Y] = meshgrid(1:width, 1:height);
cent = f.*(-1).^(X + Y);

(2)直接以FFT2进行傅立叶变换;

F = fft2(cent);

(3)进行Butterworth滤波

% generate Butterworth filtering kernel
kernel = zeros(height, width);
for u = 1:height
    for v = 1:width
        D = sqrt((u - height / 2)^2 + (v - width / 2)^2);
        kernel(u, v) = 1 / (1 + (D / D0)^2);
    end
end
% fitering
F = F.*kernel;

(4)DFT反变换后取实部;

% get conjugate F
for u = 1:height
    for v = 1:width
        F(u, v) = (real(F(u, v)) - imag(F(u, v)) * 1i) / (height * width);
    end
end
% get conjugate f by doing 2-dimension FFT on conjugate F
cent = fft2(F);
% get real part
for u = 1:height
    for v = 1:width
        cent(u, v) = real(cent(u, v));
    end
end

(5)以(−1)(x+y)(-1)^{(x + y)}(1)(x+y) 乘以(3)中结果,反中心变换。

f = cent.* (-1).^(X + Y);
滤波效果

在这里插入图片描述
从频域的角度来看,观察我们用来构造滤波器的公式,当维度nnn保持不变时,随着截止频率D0D_0D0的增大,分母越小,分母的增加速度也越小,也就是滤波器从中心往周围扩散的下降趋势变小了,变得较为平坦,我们可以从下图图像的滤波器的变化可以看出,滤波器亮度高的部分逐渐展开变宽。这也意味着更多的高频成分被保留了,图像的细节也就越明显了。
在这里插入图片描述
从空域的角度来看,考虑高斯低通滤波器,再考虑高斯滤波器的傅里叶变换,高斯滤波器的傅里叶变换之后还是一个高斯滤波器,那么显然,高斯滤波器傅里叶反变换之后的结果也是一个高斯滤波器,也就是在空域中。Butterworth低通滤波器结构与效果和高斯低通滤波器相似,那么,当我们对Butterworth反变换与图像在空域中进行卷积,也将会类似在空域中进行高斯滤波后的效果,即对图片进行平滑操作,图像会变得模糊。参考一下空域卷积和到频域的转换式子:

f(x,y)∗g(x,y)⟷F(x,y)⋅G(x,y) f(x, y) * g(x, y) \longleftrightarrow F(x, y) \cdot G(x, y) f(x,y)g(x,y)F(x,y)G(x,y)

即,空域的卷积相当于频域率的逐点相乘的结果,反过来也就是说,在频域中进行Butterworth滤波,相当于对Butterworth滤波器反变换到空域中和图像做卷积。

设计一个二阶Butterworth低通滤波器需要从理论分析、参数计算到硬件或软件实现的完整流程。以下是技术方案的详细步骤和实现方法: ### 3.1 二阶Butterworth低通滤波器的传递函数 二阶Butterworth滤波器的传递函数形式如下: $$ H(s) = \frac{V_{out}(s)}{V_{in}(s)} = \frac{\omega_0^2}{s^2 + \frac{\omega_0}{Q}s + \omega_0^2} $$ 其中: - $\omega_0 = 2\pi f_c$ 是角频率,$f_c$ 是截止频率; - $Q$ 是品质因数,对于Butterworth滤波器,通常 $Q = \frac{1}{\sqrt{2}} \approx 0.707$,以保证幅频响应在通带内最平坦 [^2]。 ### 3.2 滤波器参数设计 以一个截止频率 $f_c = 5\,\text{kHz}$ 的二阶Butterworth低通滤波器为例,设计步骤如下: 1. **计算 $\omega_0$**: $$ \omega_0 = 2\pi f_c = 2\pi \times 5000 \approx 31416\,\text{rad/s} $$ 2. **确定 $Q$ 值**: $$ Q = \frac{1}{\sqrt{2}} \approx 0.707 $$ 3. **写出传递函数**: $$ H(s) = \frac{31416^2}{s^2 + \frac{31416}{0.707}s + 31416^2} $$ ### 3.3 电路实现(有源滤波器) 一种常见的实现方式是采用压控电压源(VCVS)结构的二阶有源低通滤波器。电路由两个电容 $C_1$、$C_2$ 和两个电阻 $R_1$、$R_2$ 组成。 传递函数可表示为: $$ H(s) = \frac{A_0}{1 + s(R_1C_1 + R_2C_2) + s^2R_1R_2C_1C_2} $$ 其中: - $A_0 = 1 + \frac{R_f}{R_g}$ 是增益; - $R_f$ 和 $R_g$ 是反馈电阻; - $f_c = \frac{1}{2\pi\sqrt{R_1R_2C_1C_2}}$ [^3]。 ### 3.4 离散化实现(数字滤波器) 若需在嵌入式系统或数字信号处理中实现,可以使用差分方程或Z变换进行离散化。例如,使用MATLAB或C语言实现: #### MATLAB 示例代码: ```matlab % 设计二阶Butterworth低通滤波器 fs = 1000; % 采样频率 fc = 50; % 截止频率 [b, a] = butter(2, fc/(fs/2), 'low'); % 二阶Butterworth低通滤波器 ``` #### C语言实现示例: ```c // 二阶Butterworth低通滤波器差分方程 float y_k, y_k1 = 0, y_k2 = 0; float x_k, x_k1 = 0, x_k2 = 0; // 系数(根据截止频率和采样率计算) float b0 = 0.2066; float b1 = 0.4132; float b2 = 0.2066; float a1 = -0.3695; float a2 = 0.1958; void filter(float input) { y_k = b0 * input + b1 * x_k1 + b2 * x_k2 + a1 * y_k1 + a2 * y_k2; // 更新状态 x_k2 = x_k1; x_k1 = input; y_k2 = y_k1; y_k1 = y_k; } ``` ### 3.5 设计工具辅助 可以使用MATLAB的 `fdatool` 工具快速设计滤波器,设置如下参数: - 通带频率:5 Hz - 阻带频率:8 Hz - 通带波纹:1 dB - 阻带衰减:40 dB [^4] ### 3.6 总结 设计一个二阶Butterworth低通滤波器的关键在于: - 正确选择截止频率 $f_c$ 和品质因数 $Q$; - 构建合适的模拟电路(如VCVS结构)或离散差分方程; - 使用MATLAB或C语言实现数字滤波; - 通过仿真或实际测试验证滤波器性能。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值