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

article/2025/8/28 1:11:49
    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;                //频点间隔,单位:Hzint 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日在加窗前对数据进行一次overlapfor(i = 0; i < F_WLEN; i++){inFFTData[i].re = inFrameData[i] * (g_win[i]);      //数据加窗hanninginFFTData[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 <= n <= alpha*N/2; 
w(n) = 1; alpha*N/2 <= n <= N/2; 
w(N-n) = w(n); 0 <= n <= N/2; 
At α = 0 it becomes rectangular, and at α = 1 it becomes a Hann window. 
*/
平顶汉宁窗的使用场景是:当2帧数据叠在一起时,当前帧大于上一帧,即当前帧所有数据和上一帧的部分数据一起叠帧时,此时就需要使用平顶汉宁窗函数。例如每一帧长320点,当前帧的320点和上一帧的后192点的数据一起叠帧,做512点的FFT,此时就需要使用平顶汉宁窗,其中平顶的数据长度为320-192+1(汉宁窗本身就有1个值为1).

 添加的窗函数还必须满足另外一个条件,即重叠缓冲区的部分的窗口的平方和必须为1, 
即:w(N)^2 + w(M+N)^2 = 1;

虽然加窗能减少频谱泄露,但是加窗也存在一个问题:加窗衰减了每帧信号的能量,特别是边界处。为了解决这一个问题,就引入了合成窗的概念。

在iSTFT中,合成窗是在iFFT之后,对时域信号做的。此次加窗,并不是为了减少频谱泄露,因为之后不再做FFT,不需要满足周期性序列条件。而是为解决分析窗导致能量衰减问题的。

总结就是要对IFFT后的数据进行重建,需要注意

根据完美重建公式,合成窗的选择,不仅跟分析窗有关,还和overlap有关。不同的overlap要采用不同的合成窗。

重点总结

对ifft后的数据要加一个合成窗函数,该函数满足重叠缓冲区的部分的窗口的平方和必须为1,即分析窗和合成窗平方和等于1,(另外测试如果对原始信号不加窗,那么ifft后可以得到正常信号)

参考文档:使用多特征建模分析语音噪声可能性的噪声抑制方法和装置.caj (专利文档:0059,0060)

2022.11.15

补充一下FFT之后取频域信号只取一半,而另一半却往往没注意是怎么分布的

下面截图看一下fft之后数据

 因为我上图是作的1024点变换,那么看一下512点是什么

 1024点FFT时,可以观察到的对称结构为

0点对应512点

511点对应的513点

1点则对应的是1023点

2点则对应的是1022点


http://chatgpt.dhexx.cn/article/MkNEcNoX.shtml

相关文章

数字信号处理基础(二):FFT和IFFT的使用以及详细分析代码书写思路

目录 1. fft和ifft的原理1.1 fft1.2 ifft 2. 书写代码思路3. 完整代码4. 结果图 1. fft和ifft的原理 1.1 fft fft是快速傅里叶变换&#xff0c;是MATLAB中计算信号频谱的函数&#xff0c;使用方法是fft(x)&#xff0c;直接对信号x进行fft计算。 由于fft函数计算信号的频谱是0…

信号处理中的反傅里叶变换(IFFT)原理

信号处理中&#xff0c;经常需要将信号转换到频域进行分析&#xff0c;有时候还会从频域转回时域&#xff0c;用到FFT和IFFT函数。 FFT变换是将信号从时域转换到频域&#xff0c;在时域看起来复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域…

adb下载、安装、环境配置

一&#xff1a;adb安装 adb下载链接&#xff1a;https://pan.baidu.com/s/1Vd6KyZ6vT2Qtmhazwre4OQ 提取码&#xff1a;3dx1 安装&#xff1a; 1.双击adb.exe文件&#xff0c;并运行。 2.添加环境变量&#xff1a; 右击计算机–属性—高级系统设置—高级—环境变量—新建&…

windows下载安装adb(极其简单)

单独安装adb&#xff0c;不安装sdk 下载adb Google很好的心&#xff0c;直接放出ADB的档案供人下载。下档路径如下&#xff1a; Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本&#xff1a;https://dl.google…

ADB-adb命令安装app

下载adb 安装adb 将名称中含有adb的文件&#xff0c;和fastboot.exe复制到 c:/windows/system32目录将名称中含有adb的所有文件复制到 c:/windows/system目录将adb.exe和AdbWinApi.dll复制到c:/windows/SysWoW64目录 有线安装apk 连接上数据线&#xff0c;然后把手机开发者模…

adb详细教程(一)-下载安装与环境变量配置

对于Android开发来说&#xff0c;adb是再熟悉不过的调试工具 但其实对于移动端的测试来说&#xff0c;adb也是一个十分重要的、能够提高测试工作效率的工具。 文章目录 一、介绍二、下载地址三、安装四、配置环境变量 一、介绍 全称 adb全称全称为Android Debug Bridge&#x…

mac下载安装adb环境

目录 方法一1、下载安装包2、下载完成后进行解压&#xff0c;目录路径注意不得包含中文3、配置环境变量4、验证安装是否成功 方法二1、安装homebrew2、安装adb3、运行adb 方法一 1、下载安装包 安装包下载地址 &#xff1a;https://developer.android.com/studio/releases/pl…

adb工具下载安装

一、adb环境配置 adb即Android Debug Bridge&#xff0c;就是可以通过窗口命令&#xff0c;使在pc端可以调试安卓移动端的一个工具包 我这里是默认电脑已经安装SDK的&#xff0c;如果没有也没关系&#xff0c;直接网上下载一个adb工具包一样的https://developer.android.goo…

adb环境配置

adb环境配置 1.下载工具包 工具包&#xff1a;platform-tools_r30.0.4-windows.zip 获取途径1&#xff1a;链接: https://pan.baidu.com/s/17BiARFlgsQa2wDETmoJIvQ?pwddsd2 提取码: dsd2 获取途径2&#xff1a;https://developer.android.google.cn/studio/releases/plat…

android adb驱动官方下载,adb驱动下载

这里给你简单的介绍一下adb驱动:adb驱动就是电脑与android设备的通信的客户端驱动程序。使用它可以直接操作管理android模拟器或者真实的andriod设备。 adb驱动百科介绍: Android设备(如手机)连接PC时所需要的驱动程序,一般Android设备连接WinXP是无需安装驱动的。 adb的全称…

windows ——adb下载与安装

一、adb下载 链接&#xff1a;https://pan.baidu.com/s/1D3eOkHsuAnZd6WoFEVC7xQ 提取码&#xff1a;sc94 二、adb安装 双击 adb-setup-1.3.exe 安装 可以查看此安装教程[转载]&#xff1a;http://m.mz6.net/detail/4506-13.html 三、adb安装成功验证 键盘快捷键&#xff1a;Wi…

adb下载安装教程(已安装Android studio)

adb下载安装教程&#xff08;已安装Android studio&#xff09; ①找到adb.exe的绝对路径如下&#xff1a; ②将绝对路径放入环境变量path中&#xff08;绝对路径不带入adb.exe&#xff09; 右击“此电脑”>“属性”>”高级系统设置“>”环境变量“>”path“ 双…

ADB下载及常用命令

ADB&#xff0c;即 Android Debug Bridge&#xff0c;它是 Android 开发/测试人员不可替代的强大工具 文章目录 预先准备adb的平台工具软件包下载配置环境变量 连接设备确认连接状态\查询已连设备USB 连接无线连接&#xff08;Android11 及以上&#xff09; 应用管理查看应用列…

ADB 下载地址

adbshell 点击ADBkit下载

mac os adb下载

一 adb安装&#xff1a; 打开终端&#xff0c;输入命令 1.安装homebrew&#xff1a; 方式一&#xff1a;ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 方式二&#xff1a;/bin/zsh -c "$(curl -fsSL https:/…

小知识·adb安装和使用方法

目录 一、adb是什么&#xff1f; 二、adb有什么作用 三、如何启用adb调试 四 如何判断设备连接正常 五 如何下载安装adb 1、adb下载地址&#xff1a; 2、按装步骤 六、adb命令大全 1.查看设备 2.Adb应用管理 3.安装APK 4.卸载APK 5.查看设备信息 5.使用 Monkey 进…

adb下载安装及使用

1.adb下载安装 有两种方法&#xff1a; 1.下载一个adb的压缩包&#xff0c;直接解压&#xff0c;每次在解压的文件夹中执行命令操作即可&#xff0c;或者进行环境变量配置&#xff0c;这样以后无论在哪个文件都可以执行操作。 2.下载了Android Studio的文件中就带有adb&…

adb工具下载及安装

adb工具下载 点击下载adb工具 https://qny.aoarasi.com/software/adb/platform-tools_r33.0.0-windows.zip adb 工具安装 下载后解压 platform-tools_r33.0.0-windows.zip 文件 cmd进入adb.exe所在路径&#xff08;比如我的在&#xff1a;D:\software\platform-tools_r33.…

AD20-DRC检查

点击下图中的红圈内选项&#xff1a; 就会出现&#xff1a; 第一个红圈可不勾选&#xff08;可以不创建报告文件&#xff09;&#xff0c;第二个红圈中的填的稍微大一点。 接下来就是&#xff1a; 红圈中是安全间距检查&#xff0c;勾选可以检查板子中的安全间距。之后点击左…

数字后端基本概念介绍drc

今天我们要介绍的数字后端概念是drc。全称design rule check。设计规则检查。这是后端布局布线完成后signoff的一个重要指标。 版图完成后需要做物理验证(physical verification)&#xff0c;首先是对版图进行设计规则检查&#xff0c;晶圆代工厂对各自不同工艺参数制定出满足芯…