一维序列数据处理:FIR高通滤波器设计

article/2025/10/23 14:57:01

1. 加窗法设计滤波器

为什么要加窗设计滤波器?因为为了降低DFT的频率泄露。那什么是DFT频率泄露以及为什么加窗设计就可以降低DFT的频率泄露?解释这个之前,我们先介绍一下DFT(离散傅里叶变换)和三角函数的正交性知识,再介绍加窗设计的原因。

首先是DFT:
X ( m ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π n m / N = ∑ n = 0 N − 1 x ( n ) [ c o s ( 2 π n m / N ) − j ( s i n ( 2 π n m / N ) ] X(m)=\sum_{n=0}^{N-1}x(n)e^{-j2\pi nm/N}=\sum_{n=0}^{N-1}x(n)[cos(2\pi nm/N)-j(sin(2\pi nm/N)] X(m)=n=0N1x(n)ej2πnm/N=n=0N1x(n)[cos(2πnm/N)j(sin(2πnm/N)]
X ( m ) X(m) X(m)是第m个频率分量的幅值, x ( n ) x(n) x(n)是从连续变量 x ( t ) x(t) x(t)中取样得到的一个离散时间序列的第n个值。
需要注意的是,这里的N是指对时域信号有。N是固定大小,常见的都是2的整数倍。如果N个离散采样点没有采样到完整的周期数时,那么输入的残缺部分的能量就会泄露到其他频率分量上。

下面是三角函数的正交性知识点,可以解释为什么周期不完整会造成频率泄露?(正交即内积运算值为零)
对于三角函数集 { 1 , c o s ( n Ω t ) , s i n ( m Ω t ) } \{1, cos(n\Omega t), sin(m\Omega t) \} {1,cos(nΩt),sin(mΩt)},中有如下三条正交性性质:

  • 任意频率成分的sin和cos函数正交
  • 频率不相等的sin函数正交
  • 频率不相等的cos函数正交

正交成立的前提是,函数的周期要完整。比如说,频率的sin和cos函数都只有第一象限部分的数据,那么他们的内积显然不为0。但是你不能因此说明这两个函数不正交。此处内积不为零的原因是你的采样点没有完整周期。 以下面例子说明,这个对时域信号投影到频域上的影响。

对于输入信号(f=3)采样正好取到完整周期时(红色圆点)。图中f=4是对比参照系,用来说明问题的。
输入信号f=3在频域理论上应该只有频率为3处有幅值。也就是说,再频率为4的地方 s i n ( 2 π 3 t ) sin(2\pi3t) sin(2π3t) s i n ( 2 π 4 t ) sin(2\pi4t) sin(2π4t) c o s ( 2 π 4 t ) cos(2\pi4t) cos(2π4t)的内积应该为零。计算结果也正好是接近零。说明输入信号f=3在频率4处没有分量。

import numpy as np
n_vec = np.linspace(0, 1, 64)
ans = 0
for i in n_vec:ans += np.sin(2*np.pi*3*i)*np.sin(2*np.pi*4*i)
print(ans)plt.figure()
plt.plot(n_vec, np.sin(2*np.pi*4*n_vec))
plt.scatter(n_vec, np.sin(2*np.pi*3*n_vec), c='r')
plt.legend(['f = 4', 'f = 3'])
plt.show()
1.665334536937742e-16
图1 采样恰好是完整周期情况

对于输入信号(f=3.4)采样没有取到完整周期时(黄色圆点)。图中f=4是对比参照系,用来说明问题的。
f=3.4这个信号,理论上在频域上应该只有频率为3.4处有幅值。也就是说 s i n ( 2 π 3.4 t ) sin(2\pi3.4t) sin(2π3.4t) s i n ( 2 π 4 t ) sin(2\pi4t) sin(2π4t)的内积应该零。
不为零就说明了在频率4处,输入信号f=3.4有幅值。即发生了频率泄露。
由前面正交性的介绍,我们知道这个不是因为非正交引起的,而是信号不完整引起的。

ans = 0
for i in n_vec:ans += np.sin(2*np.pi*3.4*i)*np.sin(2*np.pi*4*i)
print(ans)plt.figure()
plt.plot(n_vec, np.sin(2*np.pi*4*n_vec))
plt.scatter(n_vec, np.sin(2*np.pi*3.4*n_vec), c='y')
plt.legend(['f = 4', 'f = 3.4'])
plt.show()
-5.289826894417038
图2 采样不是完整周期情况

还有一种有关分析频率的说法, f a n = m f s N , m = 0 , 1 , 2 , . . , N − 1 f_{an}=\frac{mf_s}{N}, m=0,1,2,..,N-1 fan=Nmfs,m=0,1,2,..,N1
如果 f s = 12000 , N = 1024 f_s=12000, N=1024 fs=12000,N=1024,那么 f a n = 11.7 m , m = 0 , 1 , 2 , . . . , 1023 f_{an}=11.7m, m=0,1,2,...,1023 fan=11.7m,m=0,1,2,...,1023 ,如果输入信号频率是5Hz,正好位于两个相邻的分析频率之间(0和11.7),那么5Hz的信号会在所有频率分量上出现。可以理解为频率为分析频率的输入信号正好可以被N=1024个采样点可以取到完整周期。而 f s N \frac{f_s}{N} Nfs又被成为分辨率。

加窗法为什么可以降低频率泄露呢?逆向思考,从上述分析我们知道,要想减少频率泄露,只要尽量保证进行DFT计算的信号是接近完整周期即可(是尽量,无法完全做到)。窗函数就可以透过截取信号来做到这一点,以hamming窗为例。

# 信号频谱绘图函数
from scipy import signal
from scipy.fftpack import fft
def plot_freq(x, fs):N = len(x)T = 1/fsX = x - np.mean(x)yf = fft(X)xf = np.linspace(0.0, 1.0/(2.0*T), N//2)# 画图plt.plot(xf, 2.0/N * np.abs(yf[0:N//2]))# plt.xlim(0, 500)plt.title('Signal spectrum')plt.xlabel("frequency")plt.ylabel("amplitude")plt.grid()plt.show()

下面这个函数绘制不加窗情况下,f=3.4信号的FFT变换

import numpy as np
n_vec = np.linspace(0, 1, 64)
x = np.sin(2*np.pi*3.4*n_vec)
plt.figure(figsize=(5,6))
plt.subplot(2,1,1)
plt.scatter(n_vec, x, c='y')
plt.subplot(2,1,2)
plot_freq(x, 64)
plt.show()
图3 不加窗情况下,f=3.4信号的FFT变换,频率泄露

下面代码是加窗情况下,f=3.4信号的FFT变换

import numpy as np
n_vec = np.linspace(0, 1, 64)
win = np.hamming(64)
x = np.multiply(np.sin(2*np.pi*3.4*n_vec),win)
plt.figure(figsize=(5,6))
plt.subplot(2,1,1)
plt.scatter(n_vec, x, c='y')
plt.subplot(2,1,2)
plot_freq(x, 64)
plt.show()
图4 加窗情况下,f=3.4信号的FFT变换,频率泄露改善

发现加了hamming窗的x信号变得更像周期信号。突然,意识到加窗真有点是“自欺欺人”(非贬义)的想法。不过,这算是一种工程近似办法,无法得到精确的,就寻找近似值。这种思想应用在很多领域,比如微分、积分的定义,所谓的无限逼近之前的部分就是一个粗糙的近似。

两幅图对比可以发现,加了汉明窗改善了频率泄露问题,使得频谱更加向3.4Hz靠拢。原因在于,hamming截取的信号部分比原来的采样信号,更接近一个完整的信号周期。于是,频率泄露的问题就得到了改善。(不是解决,也无法解决)

2. FIR加窗法设计高通滤波器

def plot_freqz_2(h, fs):w1, h1 = signal.freqz(h, fs=fs)plt.title('Digital filter frequency response')plt.plot(w1, 20*np.log10(np.abs(h1)), 'b')plt.ylabel('Amplitude Response (dB)')plt.xlabel('Frequency (rad/sample)')plt.grid()plt.show()

生成带噪声的信号xn:

# 生成信号:6kHz、100Hz, 10Hz,并且带有高斯噪声
t = np.linspace(0, 1, 12000)
x = np.sin(2*np.pi*5000*t) + np.sin(2*np.pi*100*t)*0.2+np.sin(2*np.pi*10*t)*0.1
xn = x + np.random.randn(len(t))
plt.figure()
plt.plot(t,x)
plt.plot(t,xn)
plt.legend(['x', 'xn'])
plt.xlim(0, 0.008)
plt.title('x and xn')
plt.xlabel("time/s")
plt.ylabel("amplitude")
plt.show()
图5 生成信号xn:6kHz、100Hz, 10Hz,并且带有高斯噪声

查看不带噪声信号和带噪声信号的频谱图。

# 不带噪声的信号频谱图
fs = 12000
plot_freq(x, fs)
图6-a 不带噪声的信号频谱图
# 带噪声信号的频谱图
plot_freq(xn, fs)
图6-b 带噪声信号的频谱图
可见高斯随机噪声的频谱是遍布每个频率分量。

下面设计加窗的FIR高通滤波器,截止频率为2500Hz,可以滤掉xn中的低频,保留5000Hz的高频信号。并显示滤波器的幅频响应。

# FIR高通滤波器设计
fs = 12000
N = 64
fc = 2500
# 滤波器的最大响应频率是fs/2.这个是由奈奎斯特采样定理决定的
g_ = signal.firwin(N+1,fc,fs=fs, pass_zero='highpass')
plot_freqz_2(g_, fs)
图7

下面对带噪声信号分别进行滤波处理,并查看频谱图。

# 带噪声信号的滤波后频谱图
new_x = signal.convolve(xn, g_, mode='full')
plot_freq(new_x, fs)
图8 带噪声信号xn的滤波后频谱图

发现滤掉了低频信号,保留了高频部分,但是高频部分中的高斯噪声依旧保留着。


http://chatgpt.dhexx.cn/article/rBXlTKKT.shtml

相关文章

悬置线高通滤波器设计

从大学到工作,初次接触过的人都觉得我很啰嗦,我很想简洁明了表达,我也读了很多高效表达方法论的书,刻意练习还是发现效果不佳。后来自我反省,发现啰嗦也有可爱的一面,出发点是自己的真诚,我想把…

【Matlab】如何使用Filter Design设计低通、高通、带阻滤波器

如何使用Filter Design设计低通、高通、带阻数字滤波器。 文章目录 前言 一、低通滤波器 二、高通滤波器 三、带阻滤波器 前言 使用Matlab自带的Filter Design APP可以方便、快捷地设计各种FIR/IIR数字滤波器,并且能输出数字滤波器的阶数、幅度响应、相位响应等…

基于汉宁窗的FIR高通滤波器设计

摘 要 本次课程设计是采用MATLAB进行设计基于汉宁窗的FIR高通滤波器音频去噪,在设计过程中,首先录制一段不少于5秒的音频音乐,作为输入信号,并对录制的信号进行采样;其次使用MATLAB会出采样后的语音信号的时域波形和频…

数字滤波器之高通滤波器设计

要求:设计一款高通滤波器,用在音频信号处理过程中,滤掉100Hz以下的信号。 实现方法:通过在Z平面放置零极点的来设计数字滤波器。 设计要点:单位圆上对应于需要加强频率的点附近放置极点,即wπ处附近落极点…

PCB布线及后仿真验证过程(干货满满,建议收藏)

一、布线的基本要求 布线次序考虑 1) 规则驱动布线遵循的基本步骤 定义禁布区,或控制区若有规则约束,要求设置规则试布线,评估单板是否可以布通,若不能布通,需要采用策略Fanout后对覆盖率检查,通常要求满…

PCB布线原则总结

1、环路最小规则------信号线与其回来构成的环路面积极可能小 2、短线规则------布线长度应尽可能短,振荡器应放在离器件很近的位置 3、开环检查规则----- 一般情况下不允许出现一端悬空的布线 4、闭环检查规则------防止信号在不同层间形成闭环 5、20H规则------防…

Altium_Designer PCB布线不受控制

我这里是单位问题: 之前左下角网格Grid设置为 mm,所以我在指定布线规则的时候,系统也是按照 mm 来的 解决方法: 英文输入的情况下,按 快捷键 Q 切换网格单位为 mil 就可以了

pcb布线注意点:晶振

EMC全称Electro Magnetic Compatibility,指设备或系统在其电磁环境中能正常工作,且不对该环境中任何事物构成不能承受的电磁骚扰的能力。EMC是评价电子产品质量的一个重要指标。 从广义上讲,EMC测试的具体项目包括以下两个大项: &#xff0…

PCB原理图绘制(6)——原理图的修改、导出与PCB布线前准

目录 一、端口名称的批量生成 二、元器件的自动编号 三、原理图器件的PCB导入 四、底板大小的设置 五、布线规则的修改 六、报错的解决 一、端口名称的批量生成 在原理图端口标注中,有时会遇到很多有规律的端口(如PA0~PA7),这…

AD 画PCB 布线时,连线就变绿

原因:把PCB界面缩小,如果发现了一个红色的阴影矩形块,那么把它删除。 红色的矩形块成为ROOM,在原理图导入PCB的时候会出现是否需要勾选的选项,默认是勾选的,新手一般都是默认,然后把红色的框删…

PCB布线规则大全

PCB布线规则图解及PCB布线参考因素解析 PCB布线应遵循的基本规则 一、控制走线方向输入和输出端的导线应尽量避免相邻平行。在 PCB 布线时,相邻层的走线方向成正交结构,避免将不同的信号线在相邻层走成同一方向,以减少不必要的层间窜扰。当 …

【PCB布线】不同电流所需PCB线宽

导线所能通过的电流与其粗细存在正相关关系&#xff1b;导线越粗&#xff0c;流过的电流越大。 PCB线宽单位换算&#xff1a;10mil 0.254mm 若要在PCB上过大电流&#xff08;以过100A为例&#xff0c;<100A可作为参考&#xff09;&#xff0c;有3种方法&#xff1a; 1.PC…

【PCB硬件】PCB布线规范技巧

PCB布线规范技巧 1、在高速PCB中&#xff0c;时钟等关键的高速信号线需要进行屏蔽处理&#xff0c;每1000mil打孔接地2、闭环规则3、开环规则4、特性阻抗连续规则5、布线方向规则6、谐振规则7、回流路径规则8、器件的退耦电容摆放规则9、小的分立器件走线须对称10、拐角设计11、…

PCB布线技巧(全)

做毕设需要自己画PCB&#xff0c;胡乱连费事费力还一堆报错&#xff0c;通过查阅资料&#xff0c;发现画PCB是很需要技巧的&#xff0c;把一些PCB连线的技巧分享给大家~~ 目录 1、布线优先次序 2、布线窜扰控制 3、布线的一般规则要求 1、布线优先次序 a) 关键信号线优先&…

pcb 布线教程详解

在 PCB 设计中&#xff0c;布线是完成产品设计的重要步骤&#xff0c;可以说前面的准备工作都是为它而做的&#xff0c; 在整个 PCB 中&#xff0c;以布线的设计过程限定最高&#xff0c;技巧最细、工作量最大。 PCB 布线有单面布线、 双面布线及多层布线。布线的方式也有两种&…

PCB布线

作为一名电子工程师&#xff0c;电子产品的小型化和系统设计的复杂性使得PCB设计越来越复杂。如今高度集成化的使得电路板越来越小&#xff0c;封装器件的管脚越来越密&#xff0c;这些都给布线带来了巨大的压力。 布线作为PCB设计过程的重中之重&#xff0c;这将直接影响PCB板…

PCB设计布线要点分析,盲目的拉线,拉了也是白拉!

有些小伙伴在pcb布线时&#xff0c;板子到手就是干&#xff0c;由于前期分析工作做的不足或者没做&#xff0c;导致后期处理时举步维艰。比如电源线、杂线拉完了&#xff0c;却漏掉一组重要的信号线&#xff0c;导致这组线没办法同组同层&#xff0c;甚至都没有完整的参考平面&…

PCB布线要点

根据 50 欧姆阻抗线宽进行布线&#xff0c;尽量从焊盘中心出线&#xff0c;线成直线&#xff0c;尽量走在表层。在需要拐弯的地方做成45 度角或圆弧走线&#xff0c;推荐在电容或电阻两边进行拐弯。如果遇到器件走线匹配要求的&#xff0c;请严 格按照datasheet上面的参考值长度…

PCB布局布线概要1

对于PCB的布局布线&#xff0c;我个人认为应该从实际需求出发分层次讨论。关于PCB布局布线的规则十分的繁杂&#xff0c;总是让初学者很困惑&#xff0c;不知如何去选择&#xff0c;目前也没有系统性较强的书籍提供给大家查阅。因此&#xff0c;我也就自己的经验在此与大家分享…

干货|最全PCB布线教程总结,14条PCB布线原则技巧,保姆级搞定PCB布线

1、坚持手动布线&#xff0c;慎用自动布线 2、了解制造商的规格 3、合适的走线宽度 4、迹线之间留出足够的空间 5、元器件放置 6、保持模拟和数字走线分开 7、接地层 8、走线和安装孔留有足够的空间 9、交替走线方向 10、避免电容耦合 11、放置散热孔和焊盘 12、接地和电源走线…