文章属于原创内容,引用需注明出处!(尊重原创力量,人人做起)
另外,感觉有用就点个赞吧。
前几天已经简单介绍过DSP中fft变换函数的用法,具体可以参考
在从VS的C++©工程向DSP的CCS工程移植时,发现同样是做fft变换,却有很多细微之处存在显著差异。下面就举例对比下:
fftw_complex *in, *out;
in = (fftw_complex*)fftw_malloc(FFTWCOMPLEXLEN*len);
out = (fftw_complex*)fftw_malloc(FFTWCOMPLEXLEN*len);
if (in == NULL || out == NULL)
{
if (in != NULL) fftw_free(in);
if (out != NULL) fftw_free(out);
return -1;
}
// fft
fftw_plan pfft = fftw_plan_dft_1d(len, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
for (int i = 0; i<len; i++)
{
in[i][0] = radiated_noise[i]; in[i][1] = 0;
}
fftw_execute(pfft);
// 1/(t*fs)频带带宽级0dB的白噪声乘以对应连续谱理想幅频响应
for (int i = 0; i<len; i++)
{
out[i][0] = *(pamp_fre + i) * out[i][0] * sqrt(t*fs);
out[i][1] = *(pamp_fre + i) * out[i][1] * sqrt(t*fs);
}
// ifft
pfft = fftw_plan_dft_1d(len, out, in, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(pfft);
for (int i = 0; i<len; i++)
radiated_noise[i] = in[i][0] / len;
fftw_destroy_plan(pfft);
fftw_free(in);
fftw_free(out);
float Input[2 * len];
// float InputOrig[2 * len];
float FFT_Out[2 * len];
float IFFT_Out[2 * len];
// 旋转因子
//#pragma DATA_ALIGN(W, 8);
float W[2 * len];
// 二进制位翻转
//#pragma DATA_ALIGN (brev, 8); // 8字节对齐
unsigned char brev[] =
{
0x00, 0x20, 0x10, 0x30, 0x08, 0x28, 0x18, 0x38,
0x04, 0x24, 0x14, 0x34, 0x0c, 0x2c, 0x1c, 0x3c,
0x02, 0x22, 0x12, 0x32, 0x0a, 0x2a, 0x1a, 0x3a,
0x06, 0x26, 0x16, 0x36, 0x0e, 0x2e, 0x1e, 0x3e,
0x01, 0x21, 0x11, 0x31, 0x09, 0x29, 0x19, 0x39,
0x05, 0x25, 0x15, 0x35, 0x0d, 0x2d, 0x1d, 0x3d,
0x03, 0x23, 0x13, 0x33, 0x0b, 0x2b, 0x1b, 0x3b,
0x07, 0x27, 0x17, 0x37, 0x0f, 0x2f, 0x1f, 0x3f
};
// 基
unsigned char rad;
if(len == || len == 256 || len == 1024 || len == 4096 || len == 16384 || len == 65536)
{
rad = 4;
}
else if(len == 32 || len == 128 || len == 512 || len == 2048 || len == 8192 || len == 32768)
{
rad = 2;
}
else
{
printf ("不支持计算 %d 点快速傅里叶变换!\n", len);
while(1);
}
for (i = 0; i < len; i++)
{
Input[i] = radiated_noise[i];
}
// 产生旋转因子
tw_gen(W, len);
// FFT 计算
DSPF_sp_fftSPxSP_r2c(len, Input, W, FFT_Out, brev, rad, 0, len);
for ( i = 0; i<len; i++)
{
FFT_Out[2*i] = *(pamp_fre + i) * FFT_Out[2 * i]* sqrt(t*fs);
FFT_Out[2*i + 1] = *(pamp_fre + i) * FFT_Out[ 2 * i + 1] * sqrt(t*fs);
}
// 产生旋转因子
tw_geni(W, len);
// IFFT 计算
DSPF_sp_ifftSPxSP_c2r(len, FFT_Out, W, IFFT_Out, brev, rad, 0, len);
for ( i = 0; i<len; i++)
radiated_noise[i] = IFFT_Out[i] ; // DSP不用除以数据长度len
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务