FFT专题:IFFT后信号如何重建 您所在的位置:网站首页 信号重建matlab指令 FFT专题:IFFT后信号如何重建

FFT专题:IFFT后信号如何重建

2024-07-10 22:45| 来源: 网络整理| 查看: 265

ifft(outFFTData, g_fft_temp, inFFTData, g_twiddle_ifft, twiddle_stride, F_WLEN); //思考ifft输出的复数结果怎么给到硬件输出

之前一直关注FFT后信号奔赴到频域处理,那么频域处理完后,怎么重建信号呢?

给出一段FFT和IFFT函数源码

int nFrameRunCount = 0; #pragma section("ss_fw_code_fast") void ToneChip_TestFFT_Process(float *Din, float *Dout, int nLen) { float freqResol; //频点间隔,单位:Hz int i = 0; int j = 0; int k = 0; float *pDataIn = (float *)Din; float *pDataOut = (float *)Dout; int nDataInLen = nLen; int twiddle_stride = 1; float amp = 0.0f; //幅值 float n2r = 2.0 / F_WLEN; //计算幅值时,相乘 complex_float *inFFTData = (complex_float *)g_fft_input; complex_float *outFFTData = (complex_float *)g_fft_output; float *inFrameData = (float * )g_inFrameData; float fAmpMax = 0.0; freqResol = (SAMPLING_RATE_48K * 1.0) / (F_WLEN * 1.0); //得到频率分辨率 memset(inFFTData, 0, sizeof(complex_float) * (F_WLEN) ); memset(outFFTData, 0, sizeof(complex_float) * (F_WLEN) ); // NHS处理帧旧数据的移动(最老的数据放在inFrameData[0],最新的数据放在了inFrameData[F_WLEN]) fft_sp_blk_move((float *)&inFrameData[nDataInLen], (float *)inFrameData, (F_WLEN - nDataInLen)); // 用新采样的数据更新NHS处理帧的sampleNumber个长度空间 fft_sp_blk_move((float *)pDataIn, (float *)&inFrameData[F_WLEN - nDataInLen], nDataInLen); nFrameRunCount++; //前面4帧就不处理 if(nFrameRunCount < F_WLEN / nDataInLen) { return; } //2021年10月29日在加窗前对数据进行一次overlap for(i = 0; i < F_WLEN; i++) { inFFTData[i].re = inFrameData[i] * (g_win[i]); //数据加窗hanning inFFTData[i].im = 0.0f; } //在ADSP21489中调用FFT库函数 cfft(inFFTData, g_fft_temp, outFFTData, g_twiddle_fft, twiddle_stride, F_WLEN); //如果inFFTData可以数据是临时性可以被重写,那么可以把g_fft_temp省出来 // cfft(inFFTData, NULL, outFFTData, g_twiddle_fft, twiddle_stride, F_WLEN); fAmpMax = -F_FLT_MAX; //计算频点的功率 for(i = 1; i < F_WLEN / 2; i++) { amp = sqrtf(outFFTData[i].re * outFFTData[i].re + outFFTData[i].im * outFFTData[i].im ); amp = amp * n2r * 2.0; if (fAmpMax < amp) { fAmpMax = amp; //找出频点中最大的值 k = i; } } cfft_mag(outFFTData, g_fftSpectrum, F_WLEN); memset(inFFTData, 0, sizeof(complex_float) * F_WLEN); memset(g_fft_temp, 0, sizeof(complex_float) * F_WLEN); twiddle_stride = 1; ifft(outFFTData, g_fft_temp, inFFTData, g_twiddle_ifft, twiddle_stride, F_WLEN); //思考ifft输出的复数结果怎么给到硬件输出 for(i = 0; i < nLen; i++) { pDataOut[i] = inFFTData[i].re; //重建信号,只取实部 // pDataOut[i] = pDataIn[i]; //直通测试 } }

 原始波形

经过fft和iff处理后上述代码输出的波形

 输出不正常,原因分析:

1.原始信号经过了hanning加窗,信号有衰减,经过加窗后,能量有所衰减。

查阅了相关资料后了解到 

在做FFT计算时,有时候需要用到平顶汉宁窗,如下: //Tukey window: for 20ms  /*  The Tukey window, also known as the cosine-tapered window,  can be regarded as a cosine lobe of width N*alpha/2 (spanning N*alpha/2 + 1 observations)  that is convolved with a rectangular window of width N(1 - alpha/2).  w(n) = 1/2 * (1 - cos(2*pi*n/(alpha*N))); 0



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有