声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2375|回复: 1

[FFT] [求助] 16位PCM做FFT,从幅值计算声压级

[复制链接]
发表于 2009-6-16 11:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
从16位PCM,单声道,做FFT变换,大致如下:
FFT(in, window);
in: 已经是一个复数的数组
window: 汉明窗,0.53836 - 0.46164 * std::cos(2.0 * M_PI * i / (FFT_N - 1)), 窗口大小FFT_N=1024.
做完FFT后的结果大都为xxxx + xxxx * i,'xxxx'表示4位整数。这是在输入数据为16位符号数的情况下出得的结果。
而如果把输入数据换成32位float(此时音频格式是32bit PCM),则做完FFT后,数值基本上为-xxxxx-ex,属于负的小数级别。
根据计算声压级的公式 20 * lg(v1/v0),对复数取模代入v1, v0为1024(既然是相对值,我确定v0值为1024)
现在的问题是32bit float PCM算出来的dB基本上都是-40左右,而16bit PCM却在+20左右。而我希望16bit PCM算出来的dB也在-40左右。
两种格式的数据都是同样的内容,只是把格式转了下。

我初步认为是v0取值的问题,现求助,怎么样合理的取v0才能让dB达到-40左右的范围?
或是输入等其它问题?

路过的各位大侠~请指点~

[ 本帖最后由 lihoo_hoso 于 2009-6-16 11:50 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2009-7-6 20:34 | 显示全部楼层
问题已经解决,在输入时把16位数据除以32767.0使之在(-1,1)的范围内即可。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 17:08 , Processed in 0.079259 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表