lihoo_hoso 发表于 2009-6-16 11:47

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

从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 编辑 ]

lihoo_hoso 发表于 2009-7-6 20:34

问题已经解决,在输入时把16位数据除以32767.0使之在(-1,1)的范围内即可。
页: [1]
查看完整版本: [求助] 16位PCM做FFT,从幅值计算声压级