【kissfft】使用过程中的一些坑总结

article/2025/9/27 12:06:22

API

kissfft有两套API,
一个是在kiss_fftr.h中
kiss_fftr.h
另一个在kiss_fft.h中
kiss_fft.h

区别

Basic API还是kiss_fft.h里的,kiss_fftr.h是在kiss_fft.h的基础上封装了一层。

Basic API只有fft没有见到ifft??
利用频域数据的共轭对称性可以使用一个接口完成fft和ifft,这里的逻辑也即是kiss_fftr.h里封装的两个接口


Demo编码数据类型都采用FIXED_POINT, 即int16

Demo

下面的代码是在源码中test_real.c中改的,部分函数可参见源码,这里不再列出

    int i = 0;int nfft = 8;kiss_fft_cpx cin[nfft];kiss_fft_cpx cout[nfft];kiss_fft_cpx sout[nfft];kiss_fft_cfg kiss_fft_state;kiss_fftr_cfg kiss_fftr_state;kiss_fft_scalar rin[nfft * 2];kiss_fft_scalar rout[nfft * 2];memset(rin, 0, sizeof(short) * nfft * 2);memset(rout, 0, sizeof(short) * nfft * 2);kiss_fft_scalar zero;memset(&zero, 0, sizeof(zero));for (i = 0; i < nfft; ++i) {rin[i] = rand_scalar();cin[i].r = rin[i];cin[i].i = zero;}for (; i < nfft * 2; ++i) {rin[i] = rand_scalar();}printf(" init data for kiss_fft (rin): ");for (i = 0; i < nfft * 2; i++) {printf("%d, ", rin[i]);}printf("\n");printf(" init data for kiss_fft (cin): ");for (i = 0; i < nfft; i++) {printf("(%d+%di), ", cin[i].r, cin[i].i);}printf("\n");memset(cout, 0, sizeof(short) * nfft);memset(sout, 0, sizeof(short) * nfft);kiss_fft_state = kiss_fft_alloc(nfft, 0, 0, 0);kiss_fftr_state = kiss_fftr_alloc(nfft, 0, 0, 0);kiss_fft(kiss_fft_state, cin, cout);kiss_fftr(kiss_fftr_state, rin, sout);free(kiss_fft_state);free(kiss_fftr_state);printf(" results from kiss_fft (cout): ");for (i = 0; i < nfft; i++) {printf("(%d+%di), ", cout[i].r, cout[i].i);}printf("\n");printf(" results from kiss_fftr (sout): ");for (i = 0; i < nfft; i++) {printf("(%d+%di), ", sout[i].r, sout[i].i);}printf("\n");printf("##### nfft=%d, inverse=%d, snr=%g\n", nfft, 0, snr_compare(cout, sout, (nfft / 2) + 1));kiss_fft_state = kiss_fft_alloc(nfft, 1, 0, 0);kiss_fftr_state = kiss_fftr_alloc(nfft, 1, 0, 0);// 我们在这里分别使用cout(fft API)结果和sout(fftrAPI)结果来比较ifft的准确性// case A. kiss_fft(kiss_fft_state, cout, cin);kiss_fftri(kiss_fftr_state, cout, rin);// case B. // kiss_fft(kiss_fft_state, sout, cin);// kiss_fftri(kiss_fftr_state, sout, rin);// end casefree(kiss_fft_state);free(kiss_fftr_state);printf(" results from kiss_ifft (cin): ");for (i = 0; i < nfft; i++) {cin[i].r *= nfft;cin[i].i *= nfft;printf("(%d+%di), ", cin[i].r, cin[i].i);}printf("\n");printf(" results from kiss_fftri (rin): ");for (i = 0; i < nfft * 2; i++) {rin[i] *= nfft;printf("%d, ", rin[i]);}printf("\n");

结果

case A
实数数组是复数数据长度的两倍,但是从源码可以看到int16的数组会被强转为kiss_fft_cpx结构体,每两个数据会被拼成一个kiss_fft_cpx结构体。所以总数据量长度是一致的。

但是从结果来看,basic fft API比fftr API做出来的结果更可靠一些。(result的三四行对比)

inverse FFT

case A (使用fft API结果做ifft)

  1. 如果处理正确,得到的结果是nfft长度的复数数组,image均为0,real部分是ifft数据。
  2. fftr的结果在大于nfft长度时就开始偏离了

case B (使用fftr API结果做ifft)

case B

  1. fftr API结果不可用于fft的ifft处理。
  2. fftr的结果在大于nfft长度时就开始偏离了

结论

  1. fftAPI和fftrAPI不要混用
  2. ifft后的实数结果只能使用nfft长度,而不能使用2*nfft长度。因为数据实际上是来自kiss_fft_cpx的,数据image部分占用了nfft长度,而且都为0.

其他注意

  1. 数据越长,ifft还原越存在偏离
  2. 数据值偏小,如均值小于20,可能ifft还原后的数据大量为0. 解决方案是可以先将原始数据乘nfft,ifft后不要再乘nfft了,就是这个动作前置。

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

相关文章

2020山东大学计算机组成原理课程设计报告

《计算机组成原理》 课程设计报告 微指令模型机实现 班级&#xff1a; 姓名&#xff1a; 学号&#xff1a; 小组成员&#xff1a; 完成日期&#xff1a;2020.10.16 一、计算机的功能和用途 通过该课程设计的学习&#xff0c;我们设计一台模型机&#xff0c;该模型机运行…

创建react应用程序_创建多版本React应用程序的6个步骤

创建react应用程序 The React team said that there are no new features in React 17, but react17.0.0-rc.0 comes with the power to lazy load and deep integrate multiple versions of React. This no-feature is larger than any feature, which is a stepping stone fo…

你真的懂package.json吗

点击蓝字 「前端小苑」关注我 作者 | MasonEast 编辑 | 桔子酱 前言 在Node.js中&#xff0c;模块是一个库或框架&#xff0c;也是一个Node.js项目。Node.js项目遵循模块化的架构&#xff0c;当我们创建了一个Node.js项目&#xff0c;意味着创建了一个模块&#xff0c;这个模块…

《Linux编程》上机作业 ·004【文件I/O操作】

注&#xff1a;前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 友情提醒&#xff1a;仅供参考理解&#xff0c;请勿直接复制粘贴 友情提醒&#xff1a;仅供参考理解&#xff0c;请勿直接复制粘贴 友情提醒&#xff1a;仅供参考理解&#xff0c;…

CPU比GPU训练神经网络快十几倍,英特尔:别用矩阵运算了

来源丨机器之心 神经网络训练通常是 GPU 大显身手的领域&#xff0c;然而莱斯大学和英特尔等机构对 GPU 的地位发起了挑战。 在深度学习与神经网络领域&#xff0c;研究人员通常离不开 GPU。得益于 GPU 极高内存带宽和较多核心数&#xff0c;研究人员可以更快地获得模型训练的结…

用于基于 CNT 的射频辐射热计开发研究的 CPX-VF 探针台

我们会不时强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是阿克伦大学领导的工作&#xff0c;并发表在上个月的IEEE 微波理论与技术汇刊上。与来自美国陆军和 Nano-C Inc.&#xff08;马萨诸塞州 Westwood 的纳米结构碳材料及其应用开发商&#xff09;的研究人员…

ProJet 3510 CPX蜡模3D打印机在珠宝行业成功应用

传统的首饰设计是一个细致和增量的过程。传统设计从设计师的构图开始&#xff0c;一旦草图被批准后,就会雕刻成模型&#xff0c;如果蜡模没有足够接近原始草图或未能满足客户的期望&#xff0c;必须重做,这样会浪费大量的时间。使用ProJet 3510 CPX专业蜡成型3 d打印机&#xf…

基于 CNT 的射频辐射热计开发研究的 CPX-VF 低温探针台

有时&#xff0c;我们喜欢强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是由阿克伦大学领导并发表在上个月的IEEE Transactions on Microwave Theory and Techniques 上的工作。UA 的 ZEN-Lab 的Michael Gasper 和 Ryan Toonen 博士与美国陆军和 Nano-C Inc.&am…

Parker驱动器维修COMPAX控制器维修CPX0200H

COMPAX控制器&#xff1a;由不同的模拟功率控制信号&#xff0c;由MOSFET IC级驱动器GND/PGND&#xff08;功率接地&#xff09;&#xff09;的信号控制&#xff0c;则应分别接地。使用IC的小信号部分的控制IC&#xff0c;SGND信号与功率地之间的连接点。合理的方法是地信号地返…

用于 CPX、CPX-VF 和 CRX-VF 探针台的新手提箱选项

如果您正在寻找一种简单的方法来将样品从手套箱、干燥箱或其他惰性气氛容器转移到高真空、低温探测环境&#xff0c;您可能会感兴趣&#xff1a;一个新的专用手提箱 (PS-SC- CPX) 与可安装在我们的CPX、CPX-VF或CRX-VF探针台上的负载锁定组件 (PS-LL-CPX) 一起使用。 该手提箱具…

GE IC697CPX935 CPU模块PDF帅

IC697CPX935 是 GE 自动化和控制公司制造的具有三个内置串行端口的单槽 PLC CPU。它能够对系统进行实时控制。使用 VMEC.1 格式&#xff0c;IC697CPX935 可以通过安装在机架上的背板与不同的“智能选项”模块进行通信。该设备通过三位运行/停止控制开关或连接到运行适当软件的计…

micropython仿真器_microbit/cpx 的 python模拟器:Device Simulator Express

Device Simulator Express是一个 VSCode 的编程扩展,使用它无需硬件就能对 Circuit Playground Express(CPX)或 BBC micro:bit 仿真和调试python程序,此外还可以通过串口观察设备的输出。Device Simulator Express 和 makecode 中的设备模拟器功能类似,但它是一个 python 程…

Win10强制更新关闭方法

Win10自动更新怎么永久关闭&#xff1f;有效的Win10强制更新关闭方法 之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法&#xff0c;主要是通过一些如设置流量计费或借助一些专门的小工具来实现&#xff0c;但往往会发现&#xff0c;Win10自动更新就像打不死…

Win10强制更新禁不掉的解决方法

现况 2018年8月之后安装或者更新的win10&#xff0c;现在会出现无法禁用windows update的情况&#xff0c;表现为&#xff1a; 在服务里禁用了windows update服务&#xff0c;后续服务仍能正常启动强制更新。设置“登录”和“恢复”选项卡依然无效。在设置里关闭更新选项无效…

iOS 强制更新

废话不多说&#xff0c;直接上代码 (void)getNewVersion {NSURLRequest *request [NSURLRequest requestWithURL:[NSURL URLWithString:"http://itunes.apple.com/cn/lookup?id1036152564"]];NSURLSessionDataTask *task [[NSURLSession sharedSession] dataTaskW…

uniapp APP端在线升级功能实现讲解——强制或可选升级,下载进度显示

文章目录 概要 需求分析 技术实现梳理 1.是否更新判断&#xff1a; 2.升级弹窗的展示 3.根据升级类型限制操作 4.下载APP监听下载进度 5.下载完自动安装 核心API讲解 1.plus.downloader.createDownload(url,options,completedCallback)&#xff08;下载&#xff09; 2.plus.r…

Windows如何一键永远禁止系统更新?

大家好&#xff0c;我是小寻&#xff0c;欢迎关注公众号:工具优选&#xff0c;免费领取优质项目源码和常用工具&#xff0c;还可以加入我的交流群! 一、工具介绍 想必大家也会与小编存在同样的困惑&#xff0c;为啥我电脑上的windows会频繁的强制系统升级&#xff1f;windows…

win10总强制更新?教你永久关闭

win10系统个人觉得还挺好用的&#xff0c;但是有一点非常烦人&#xff0c;就是隔三岔五强制自动更新&#xff01; 相信也是大部分用户最不喜欢的一点。 更新后&#xff0c;系统可能还会出现一些bug&#xff0c;而且每次更新都要等上一段时间。对于每天工作繁忙的用户来说&…

解决Xshell/Xftp强制升级无法进入问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、首先创建一个Xshell.txt文件&#xff0c;用notepad打开 二、将以下代码复制入.txt文件 1.实例代码 2.保存文件&#xff0c;重命名 3.以管理员身份运行…