c - 如何将 DFT 输出缩放到 0.0 到 1.0
问题描述
我正在尝试制作一个简单的音乐可视化应用程序,我知道我需要获取我的音频样本并执行快速傅立叶变换。我试图找出如何确定震级的大小,因此我可以将其标准化为 0.0 到 1.0 之间以用于绘图目的。
我的应用程序设置为允许读取 16 位和 24 位格式的音频,因此我将所有传入的音频样本缩放为 [-1.0,1.0),然后对 N 个样本使用实数到复数的一维变换。
从那里开始,我认为我需要在 0 和 N/2 之间取每个 bin(使用函数)的绝对值cabs
,但我不确定这些数字真正代表什么或我应该用它们做什么。
我已经弄清楚如何计算每个箱的频率,我对以分贝为单位的实际幅度或幅度不感兴趣,我真的只想得到一个介于 0.0 和 1.0 之间的值。
大多数对 fftw 的解释都涉及到很多数学问题,老实说,这远远超出了我的想象。
解决方案
[根据评论,OP 试图知道在 [−1, 1] 中给定输入的任何输出箱的最大可能幅度。这个答案提供了一种确定方法。]
DFT 例程在处理缩放的方式上有所不同。一些标准化他们的输出以保持规模相同,一些让算术运算扩大规模以获得更好的性能或实现方便。所以输出的可能规模不仅仅由数学决定;这取决于使用的例程。例程的文档应该说明它使用什么缩放。
在没有明确文档的情况下,您可以通过将幅度为 1 的正弦波写入输入(以及与输出箱之一匹配的频率)来确定最大输出,然后执行变换,然后检查输出以查看哪个箱具有最大的幅度(当然,它应该是您使用的频率)。它可能是 1 或N(输入的数量),由于浮点舍入效应而有些倾斜。
(绘制时,请确保为浮点舍入效果留出一点余地——实际数字可能略大于最大值,因此请避免在您不希望出现的地方溢出或裁剪。)
推荐阅读
- php - 未选择数据库 - php 和 phpmyadmin
- python - Python sql数据框数据类型转换拆分为日期和时间列
- java - Spring Cloud Stream kafka 暂停/恢复活页夹
- python - 如何在html标签的href属性中添加python代码
- google-sheets - 用于 Power Bi 报告时,Google 表格 - 发布到网络的安全性如何?
- file-upload - ngx 上传器无法在服务器上上传裁剪的图像 - 角度 6
- java - 安全 OAuth2 单点注销
- android - 如何逐个下载音频文件并显示进度
- unix - 查找文本文件中出现次数最多的单词
- java - Maven:首先使用容器依赖解决依赖关系