使用solo做一个简单的FFT分析的知识点演示以及一个可用的鸟鸣识别功能

FFT演示工具程序报告

一、程序模块功能介绍

本程序是一款面向数字信号处理教学的交互式FFT知识点演示工具,采用模块化的标签页架构,将FFT相关的核心知识点拆分为独立的功能模块,通过可视化的方式帮助我来理解傅里叶变换的核心概念。

1.主程序模块 [main.py]

作为整个应用的入口与框架,负 责:

实现子模块的动态加载,将不同的知识点演示功能整合到统一的 窗口中

图片

2.分辨率 与补零模块

该模块用于演示FFT频率分辨率的核心概念 ,功能包括:

支持自定义多频信号的频率参数、采样率、原始采样点数与F FT补零点数

提供矩形窗、汉宁窗、汉明窗等多种窗函数的选择,可视化展示原始模拟波形、采样后的离散波形以及FFT频谱分析结果支持历史结果的保存与加载,方便用户对比不同参数下的分析结果内置4组典型预设参数,方便 快速切换对比 场景

[Upload failed]

3.泄漏与加窗模

该模块用于演示频谱泄漏现象与窗 函数的作用,功能包括:

支持调整信号频率、采样率与采样点数,模拟整周 期/非整周期采样场景

提供4种常用窗函数的选择:矩形窗、汉宁窗、汉明窗、布莱克曼窗内置一键切换整周期 /非整周期采样的快捷按钮

通过周期延拓示意图直观展示非整周期截断导 致的信号跳变问题
[Upload failed]

4.栅栏效应模块

该模块用于演示 FFT的栅栏效应,功能包括:

支持自定义信号频率、 采样率以及补零前后的FFT点数

内置原理说明,帮助用户理解栅栏效应的产生原因可视化对比补零前后的FFT结果,用灰色竖线模拟栅栏FFT离散频点)直观展示真实频率落在栅栏缝隙时的测 量误差, 以及补零对栅 栏效应的缓解作用

[Upload failed]

5. DFT/FFT计算量模块

该模块用于直观对比DFT FFT算法的计算效率差异,功能包括:

支持通过滑块动态调整 采样点数N,范围覆盖116384

提供两种可视化模式:折线图 展示复杂度增 长趋势,方块面积图直观映射 计算量大小

[Upload failed]

6.鸟鸣识别模块

该模块是FFT技术的实际应用演示,功能包括:

支持用户上传本地音频文件,进行鸟鸣声的分析与识别

实现音频的读取、归一化与预处理

基 于短时傅里叶变换(STFT)计算音频的频谱图与平均功率谱

集成BirdNET深度学习模型,实现高精度的鸟类鸣叫声识别

可视化 展示音频的频谱图与功率谱,标记识别到的鸟类的 频率范围

[Upload failed]

二、FFT核心知识点与演示 内容解析

1.频率分辨率与补零:物理分辨率vs插值分辨率

FFT的频率分辨率是指 区分两个相邻频率成分的能力,这是FFT分析中最容易被混淆的概念之一。

物理分辨率:由信号的实际时长 [Upload failed] 决定,公式为 [Upload failed]。这是FFT能真 正区分两个频率的极限,由采集到的信号的有效长度决定,无法通过后续处理提升。

补零插值:在原始信号后补充零值,增加FFT的计算点数 [Upload failed],可以减小频点间隔 [Upload failed],让频谱曲线变得更平滑,实现视觉上的分辨 率提升,但这只是对频谱的插值,并没有增加新的信息,无法提升物理分辨率。

100 0点原始信 号,不补 零:物理 分辨率 1Hz,无法区分间隔小于1Hz的频率

[Upload failed]

1000点原始信号 ,补零到7 000点:频点间隔变小,频谱更平滑,但依然无法区分间隔小于1Hz的频率

[Upload failed]

7000点原始信号,不补零:物理分辨率提升到~0.14Hz,能 够清晰区分相邻的频率,只是频谱显示并不干净,1.05MHz处还是宽瓣,泄露了
[Upload failed]

7000点原始信号,补零到800 0FFT点数,就得到了两个干净的峰。

[Upload failed]

2.频谱泄漏与加窗:截断误差的补偿

FFT 算法的隐含假设是:输入的有限长信号是无限长周期信号的一个周期。当这个假设不成立时,就会产生频谱泄漏。

泄漏的产生:当我们对非整周期的信号进行截断时,将截断后的信号做周期延拓,会在周期边界处产生不 连续的跳变。这个跳变会引入大量的高频分量,导致原本集中在单频点的能量扩散到整个频谱上,也就是频谱泄漏。

窗函数的作用:加窗的本质 是对原始信号进行加权,将信号两端的幅度逐渐衰减到0,使得周期延拓之后边界处不再有跳变,从而抑制泄漏。

窗函数的权衡:所有窗函数都是在频率分辨率" 泄漏抑制"之间做权衡:

矩形窗:主瓣最窄,分辨率最高,但 旁瓣最高,泄漏最严重

汉宁/汉明窗:主瓣宽度加倍,分辨率降低,但旁瓣 得到有效抑制

布莱克曼窗:主瓣宽度增加到3倍,分辨率进一步降低,但旁瓣抑制达到最优

该模块通过周期延拓示意图,直观展示了非整周期截断时的边界跳变;同时对比了不同窗函数的频谱,用户可以清晰看到:矩形窗下泄漏非常严重,单频信号的频 谱spread得很开,而随着窗函数的升 级,泄漏逐渐被抑制,但频谱的主瓣也逐渐变宽,让用户直观理解这个权衡关系。

3.栅栏效应:离散频点的观测限制

FFT的输出是离散 的频点,我们只能在这些离散的位置上观测频谱,这就像透过栅栏看风景,只能看到栅栏缝隙对应的位置,中间的部分无法直 接观测。

当信号的真实频率恰好落在FFT的离散频点上时,我们可以准确测量它的幅度和频率;

当真实频率落在两个频点之间时,我们无法直接观测到它,能量会扩散到周围的频点上,导致频率测量的误差,这就是栅栏效应。

补 零可以增 加FFT的点数,减小频点间隔,让栅栏变得更密,从而缓解栅栏效应,让我们能更准确地定位真实频率的位置。

该模块用灰色竖线直观地标记出FFT的离散频点(也就是"栅栏"),可以看到:在原始的少点数FFT中,栅栏很稀疏,真实频率1.2Hz恰好落在栅栏的缝隙里,导致FFT的峰值出 现在1Hz的位置,测量误差很大;而补零之后, 栅栏变得更密,频点间隔变小,真实频率的位置可以被更准确地定位,测量误差显著减小。

4.计算复杂度:FFT为什 么这么快

直接计算DFT的复杂度很高,而FFT通过分治算法将复杂度大幅降低,这也是FFT能够被广泛应用的核心原因。

DFT的复杂度:直接 计算DFT,每个频率分量都需要和N个采样点做复数乘法,因此时间复杂度是 [Upload failed],随着采样点数N的增长,计算量会平方级增长。

FFT的复杂度:快速傅里叶变换利用分治法,将N点的DFT分解为多个更小的DFT,通过旋转因子的对称性减少重复计算,将时间复杂度降低到 [Upload failed]
同时实时计算两者的运算次数差距,比如当N=1 024时,DFT需要104万次运算, 而FFT只需要1万次,差距达到100倍,让用户直观感受到FF T的效率优势。

5.实际应用:鸟鸣识别中的FFT

FFT是音频信号处理的基础技术,鸟鸣识别就是一个典型的应用场景。

核心知识点

时域的音频信号无法直接提取频率特征,通过FFT将时域信号转换到频域,才能分析信号的频率组成。

对于非平稳的音频信号,我们使用短时傅里叶变换(STFT),将信号分块做FFT,得到随时间变化的频 谱图,从而分析信号的时频特征。

不同鸟类的鸣叫声有不同的频率特征,通过频谱分析我们可以提取这些特征,进而实现鸟类的识别。

三、不足与改进方向与思路

1.功能扩展方向

**自定义信号输入:**当前程序的大部分演示模块都只支持内置 的合成正弦信号,无法处理的实际数据。

这个需要搭配硬件输入,这个由于时间关系,暂时没有完成,其实可以增加一个信号通道专门用于存放用户通过麦克风输入的音频。

至 于实时FFT目前没有好 的思路去做。如何实现实时的FFT频谱分析,是一个比较有挑战的想法。这个甚至可以和鸟鸣识别模块联动,实现真实的野外环境中对鸟鸣的分析。

2.交互体验优化

输入体验:频率超过采样率的一半,或者负数的采样点数,导致计算结果 错误,直接报错,也没有提供相关说明,还有就是 FFT(补零) 点数与实际采样点数的动态跟随,如果使用时输入的FFT(补零)点数小于实际采样点数时程序也会报错。

这个改进思路就是 报错后提供良好地说明。

图表交互功能:

当前的图表是静态的,不支持交互操作。不支持鼠标滚轮缩放、框选放大、平移等操作,不方便用户查看频谱的细节,已无法保存图片。

**3.其他功能的接入
没有AI平台的接入:**只 为了分析鸟鸣接入了Birdnet库,没有接入AI等模型库来进一步丰富和完善程序功能,如何通过接入AI来帮助使用着更好地学习和理解FFT也是一个很有意思的方向。

1 个赞

FFT 演示工具程序报告

一、程序模块功能介绍

本程序是一款面向数字信号处理教学的交互式 FFT 知识点演示工具,采用模块化的标签页架构,将 FFT 相关的核心知识点拆分为独立的功能模块,通过可视化的方式帮助我来理解傅里叶变换的核心概念。

1. 主程序模块 [main.py]

作为整个应用的入口与框架,负责:

实现子模块的动态加载,将不同的知识点演示功能整合到统一的窗口中

2. 分辨率与补零模块

该模块用于演示 FFT 频率分辨率的核心概念,功能包括:

支持自定义多频信号的频率参数、采样率、原始采样点数与 FFT 补零点数

提供矩形窗、汉宁窗、汉明窗等多种窗函数的选择,可视化展示原始模拟波形、采样后的离散波形以及 FFT 频谱分析结果支持历史结果的保存与加载,方便用户对比不同参数下的分析结果内置 4 组典型预设参数,方便快速切换对比场景

3. 泄漏与加窗模

该模块用于演示频谱泄漏现象与窗函数的作用,功能包括:

支持调整信号频率、采样率与采样点数,模拟整周期 / 非整周期采样场景

提供 4 种常用窗函数的选择:矩形窗、汉宁窗、汉明窗、布莱克曼窗内置一键切换整周期 / 非整周期采样的快捷按钮

通过周期延拓示意图直观展示非整周期截断导致的信号跳变问题

4. 栅栏效应模块

该模块用于演示 FFT 的栅栏效应,功能包括:

支持自定义信号频率、采样率以及补零前后的 FFT 点数

内置原理说明,帮助用户理解栅栏效应的产生原因可视化对比补零前后的 FFT 结果,用灰色竖线模拟 “栅栏”(FFT 离散频点)直观展示真实频率落在 “栅栏缝隙” 时的测量误差,以及补零对栅栏效应的缓解作用

5. DFT/FFT 计算量模块

该模块用于直观对比 DFT 与 FFT 算法的计算效率差异,功能包括:

支持通过滑块动态调整采样点数 N,范围覆盖 1 到 16384

提供两种可视化模式:折线图展示复杂度增长趋势,方块面积图直观映射计算量大小

6. 鸟鸣识别模块

该模块是 FFT 技术的实际应用演示,功能包括:

支持用户上传本地音频文件,进行鸟鸣声的分析与识别

实现音频的读取、归一化与预处理

基于短时傅里叶变换(STFT)计算音频的频谱图与平均功率谱

集成 BirdNET 深度学习模型,实现高精度的鸟类鸣叫声识别

可视化展示音频的频谱图与功率谱,标记识别到的鸟类的频率范围

**二、**FFT 核心知识点与演示内容解析

1. 频率分辨率与补零:物理分辨率 vs 插值分辨率

FFT 的频率分辨率是指区分两个相邻频率成分的能力,这是 FFT 分析中最容易被混淆的概念之一。

物理分辨率 :由信号的实际时长 决定,公式为 。这是 FFT 能真正区分两个频率的极限,由采集到的信号的有效长度决定,无法通过后续处理提升。

补零插值 :在原始信号后补充零值,增加 FFT 的计算点数 ,可以减小频点间隔 ,让频谱曲线变得更平滑,实现 “视觉上的分辨率提升”,但这只是对频谱的插值,并没有增加新的信息,无法提升物理分辨率。

1000 点原始信号,不补零:物理分辨率 1Hz,无法区分间隔小于 1Hz 的频率

1000 点原始信号,补零到 7000 点:频点间隔变小,频谱更平滑,但依然无法区分间隔小于 1Hz 的频率

7000 点原始信号,不补零:物理分辨率提升到~0.14Hz,能够清晰区分相邻的频率,只是频谱显示并不干净,1.05MHz处还是宽瓣,泄露了

7000 点原始信号,补零到8000FFT点数,就得到了两个干净的峰。

2. 频谱泄漏与加窗:截断误差的补偿

FFT 算法的隐含假设是:输入的有限长信号是无限长周期信号的一个周期。当这个假设不成立时,就会产生频谱泄漏。

泄漏的产生 :当我们对非整周期的信号进行截断时,将截断后的信号做周期延拓,会在周期边界处产生不连续的跳变。这个跳变会引入大量的高频分量,导致原本集中在单频点的能量扩散到整个频谱上,也就是频谱泄漏。

窗函数的作用 :加窗的本质是对原始信号进行加权,将信号两端的幅度逐渐衰减到 0,使得周期延拓之后边界处不再有跳变,从而抑制泄漏。

窗函数的权衡 :所有窗函数都是在 “频率分辨率” 和 “泄漏抑制” 之间做权衡:

矩形窗:主瓣最窄,分辨率最高,但旁瓣最高,泄漏最严重

汉宁 / 汉明窗:主瓣宽度加倍,分辨率降低,但旁瓣得到有效抑制

布莱克曼窗:主瓣宽度增加到 3 倍,分辨率进一步降低,但旁瓣抑制达到最优

该模块通过周期延拓示意图,直观展示了非整周期截断时的边界跳变;同时对比了不同窗函数的频谱,用户可以清晰看到:矩形窗下泄漏非常严重,单频信号的频谱 spread 得很开,而随着窗函数的升级,泄漏逐渐被抑制,但频谱的主瓣也逐渐变宽,让用户直观理解这个权衡关系。

3. 栅栏效应:离散频点的观测限制

FFT 的输出是离散的频点,我们只能在这些离散的位置上观测频谱,这就像透过栅栏看风景,只能看到栅栏缝隙对应的位置,中间的部分无法直接观测。

当信号的真实频率恰好落在 FFT 的离散频点上时,我们可以准确测量它的幅度和频率;

当真实频率落在两个频点之间时,我们无法直接观测到它,能量会扩散到周围的频点上,导致频率测量的误差,这就是栅栏效应。

补零可以增加 FFT 的点数,减小频点间隔,让 “栅栏” 变得更密,从而缓解栅栏效应,让我们能更准确地定位真实频率的位置。

该模块用灰色竖线直观地标记出 FFT 的离散频点(也就是 “栅栏”),可以看到:在原始的少点数 FFT 中,栅栏很稀疏,真实频率 1.2Hz 恰好落在栅栏的缝隙里,导致 FFT 的峰值出现在 1Hz 的位置,测量误差很大;而补零之后,栅栏变得更密,频点间隔变小,真实频率的位置可以被更准确地定位,测量误差显著减小。

4. **计算复杂度:**FFT 为什么这么快

直接计算 DFT 的复杂度很高,而 FFT 通过分治算法将复杂度大幅降低,这也是 FFT 能够被广泛应用的核心原因。

DFT 的复杂度 :直接计算 DFT,每个频率分量都需要和 N 个采样点做复数乘法,因此时间复杂度是 ,随着采样点数 N 的增长,计算量会平方级增长。

FFT 的复杂度 :快速傅里叶变换利用分治法,将 N 点的 DFT 分解为多个更小的 DFT,通过旋转因子的对称性减少重复计算,将时间复杂度降低到 。
同时实时计算两者的运算次数差距,比如当 N=1024 时,DFT 需要 104 万次运算,而 FFT 只需要 1 万次,差距达到 100 倍,让用户直观感受到 FFT 的效率优势。

5. 实际应用:鸟鸣识别中的 FFT

FFT 是音频信号处理的基础技术,鸟鸣识别就是一个典型的应用场景。

核心知识点

时域的音频信号无法直接提取频率特征,通过 FFT 将时域信号转换到频域,才能分析信号的频率组成。

对于非平稳的音频信号,我们使用短时傅里叶变换(STFT),将信号分块做 FFT,得到随时间变化的频谱图,从而分析信号的时频特征。

不同鸟类的鸣叫声有不同的频率特征,通过频谱分析我们可以提取这些特征,进而实现鸟类的识别。

三、不足与改进方向与思路

1. 功能扩展方向

自定义信号输入: 当前程序的大部分演示模块都只支持内置的合成正弦信号,无法处理的实际数据。

这个需要搭配硬件输入,这个由于时间关系,暂时没有完成,其实可以增加一个信号通道专门用于存放用户通过麦克风输入的音频。

至于实时FFT目前没有好的思路去做。如何实现实时的FFT频谱分析,是一个比较有挑战的想法。这个甚至可以和鸟鸣识别模块联动,实现真实的野外环境中对鸟鸣的分析。

2. 交互体验优化

输入体验:频率超过采样率的一半,或者负数的采样点数,导致计算结果错误,直接报错,也没有提供相关说明,还有就是FFT(补零)点数与实际采样点数的动态跟随,如果使用时输入的FFT(补零)点数小于实际采样点数时程序也会报错。

这个改进思路就是报错后提供良好地说明。

图表交互功能

当前的图表是静态的,不支持交互操作。不支持鼠标滚轮缩放、框选放大、平移等操作,不方便用户查看频谱的细节,已无法保存图片。

3. 其他功能的接入
没有 AI **平台的接入:**只为了分析鸟鸣接入了Birdnet库,没有接入AI等模型库来进一步丰富和完善程序功能,如何通过接入AI来帮助使用着更好地学习和理解FFT也是一个很有意思的方向。

最后提供一个网盘链接,我打包好了一个完整的exe文件,无需安装任何库文件以及配置任何环境,有兴趣可以下载后使用,如果有什么不足,还请多多包含
通过网盘分享的文件:main.exe 链接: https://pan.baidu.com/s/17gTM7XhrvyXa4YvwajU_QA 提取码: sksb

2 个赞

鸟鸣识别这块挺有意思,之前自己用matlab搞过类似的东西,调参数调到怀疑人生。

1 个赞