FFT旋转因子的C浮点转换
我写了一个代码,用C计算FFT的旋转因子。现在,我想把它从浮点转换成定点,这样我就可以在DSP处理器上测试它了。我想分别计算旋转因子,例如: 1) Cos(2*pi*k/N)-jSin(2*pi*k/N),其中k从0..N/3-1开始,N=1536FFT旋转因子的C浮点转换,c,signal-processing,C,Signal Processing,我写了一个代码,用C计算FFT的旋转因子。现在,我想把它从浮点转换成定点,这样我就可以在DSP处理器上测试它了。我想分别计算旋转因子,例如: 1) Cos(2*pi*k/N)-jSin(2*pi*k/N),其中k从0..N/3-1开始,N=1536 如何以固定点(比如Q15格式)返回答案?Q15数字有15个分数位。最有可能的是,它有一个整数位或符号位的附加位。(从上下文或问题中未提供的其他文档中可以看出这一点。)让我们假设附加位是整数位,并且该值是无符号的 如果16位在解释为无符号整数时具有值x
如何以固定点(比如Q15格式)返回答案?Q15数字有15个分数位。最有可能的是,它有一个整数位或符号位的附加位。(从上下文或问题中未提供的其他文档中可以看出这一点。)让我们假设附加位是整数位,并且该值是无符号的 如果16位在解释为无符号整数时具有值x,则在解释为Q15时具有值x/215。显然,要将Q15值x/215转换为整数值x,只需乘以215即可 因此,给定某个值y,它可能是旋转因子之一的余弦或正弦,您可以将其转换为整数,通过乘以215,将其存储在16位中,就像代码
y*32768
一样,并从浮点转换为整数。但是,从浮点到整数的转换会向零截断,因此33.9变为33。如果取而代之的是四舍五入到最接近的整数,通常误差较小。您可以使用nearbyint(y*32768)
完成此操作
存在一些问题:
- 如果Q15是无符号的,则不能表示负值,但某些旋转因子是负值
- 如果Q15是有符号的,它大概没有整数位,因此它可以表示的最大值是32767/32768。但是,一些旋转因子是+1或–1,因此无法表示它们。可能有一些方法可以通过专门处理这些旋转因素来解决这个问题
- 可以想象,您的Q15使用32767而不是32768作为标尺,因为这将允许它既可以签名,也可以处理+1和-1。我认为这是不寻常的,但我提到这一点,因为上述两项都不是完全令人满意的。在本例中,您将在转换中使用32767代替32768。(像素强度通常以这种方式存储;它们的缩放值范围为0到255,表示从0到1的强度。)