尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
simple_fft.c
/********************************************************************************* file simple_fft.c* brief 简单 radix-2 Cooley-Tukey FFT 实现无第三方算法库。*******************************************************************************/#include simple_fft.h#define SIMPLE_FFT_MAX_LENGTH 256Ustatic uint8_t SimpleFFT_IsPowerOfTwo(uint16_t value);static uint16_t SimpleFFT_ReverseBits(uint16_t value, uint8_t bit_count);static uint8_t SimpleFFT_Log2(uint16_t value);uint8_t SimpleFFT_ForwardReal(const float *input, SimpleFFT_Complex_t *output, uint16_t length){uint16_t i;uint16_t block_size;uint8_t bits;if ((input 0) || (output 0) || (length SIMPLE_FFT_MAX_LENGTH) ||(SimpleFFT_IsPowerOfTwo(length) 0U)){return 0U;}/* FFT 首先做位倒序重排输入第 i 个样本写入输出的 bit_reverse(i) 位置。 */bits SimpleFFT_Log2(length);for (i 0U; i length; i){uint16_t reversed SimpleFFT_ReverseBits(i, bits);output[reversed].real input[i];output[reversed].imag 0.0f; /* 实数输入的虚部固定为 0。 */}/* 每一级把两个小 DFT 合成一个更大的 DFT2 - 4 - ... - length。 */for (block_size 2U; block_size length; block_size 1U){float step_real;float step_imag;uint16_t half (uint16_t)(block_size 1U);uint16_t start;uint16_t j;/** 本级旋转因子 exp(-j*2*pi/block_size)。只支持最大 256 点* 所有需要的 cos/sin 常量均列出避免调用 math 库。*/switch (block_size){case 2U: step_real -1.0f; step_imag 0.0f; break;case 4U: step_real 0.0f; step_imag -1.0f; break;case 8U: step_real 0.70710678f; step_imag -0.70710678f; break;case 16U: step_real 0.92387953f; step_imag -0.38268343f; break;case 32U: step_real 0.98078528f; step_imag -0.19509032f; break;case 64U: step_real 0.99518473f; step_imag -0.09801714f; break;case 128U: step_real 0.99879546f; step_imag -0.04906767f; break;case 256U: step_real 0.99969882f; step_imag -0.02454123f; break;default: return 0U;}for (start 0U; start length; start (uint16_t)(start block_size)){float w_real 1.0f;float w_imag 0.0f;for (j 0U; j half; j){uint16_t top (uint16_t)(start j);uint16_t bottom (uint16_t)(top half);float t_real w_real * output[bottom].real - w_imag * output[bottom].imag;float t_imag w_real * output[bottom].imag w_imag * output[bottom].real;float top_real output[top].real;float top_imag output[top].imag;float next_w_real;output[top].real top_real t_real;output[top].imag top_imag t_imag;output[bottom].real top_real - t_real;output[bottom].imag top_imag - t_imag;/* w w * step得到本级下一个蝶形运算的旋转因子。 */next_w_real w_real * step_real - w_imag * step_imag;w_imag w_real * step_imag w_imag * step_real;w_real next_w_real;}}}return 1U;}float SimpleFFT_GetBinEnergy(const SimpleFFT_Complex_t *spectrum, uint16_t bin){if (spectrum 0){return 0.0f;}return spectrum[bin].real * spectrum[bin].real spectrum[bin].imag * spectrum[bin].imag;}static uint8_t SimpleFFT_IsPowerOfTwo(uint16_t value){return ((value 2U) ((value (uint16_t)(value - 1U)) 0U)) ? 1U : 0U;}static uint8_t SimpleFFT_Log2(uint16_t value){uint8_t bits 0U;while (value 1U){value 1U;bits;}return bits;}static uint16_t SimpleFFT_ReverseBits(uint16_t value, uint8_t bit_count){uint16_t result 0U;while (bit_count 0U){result (uint16_t)((result 1U) | (value 1U));value 1U;bit_count--;}return result;}
RELATED

相关推荐

2.5D与3D封装技术解析:从CoWoS到Chiplet的芯片集成革命

2.5D与3D封装技术解析:从CoWoS到Chiplet的芯片集成革命

1. 从平面到立体:封装技术演进的核心驱动力在芯片设计领域,我们常常听到一个说法:摩尔定律正在放缓。这背后反映的,是晶体管微缩带来的性能提升和成本降低的边际效益正在递减。当制程工艺从7nm向5nm、3nm甚至更小节点迈进时&#…

📅 2026/8/23 1:49:09
Windows右键菜单清理终极指南:3步打造高效桌面环境

Windows右键菜单清理终极指南:3步打造高效桌面环境

Windows右键菜单清理终极指南:3步打造高效桌面环境 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单过于臃肿而烦恼&#x…

📅 2026/9/10 4:48:49
蜂鸣器深度解析:从无源/有源原理到PWM驱动与实战应用

蜂鸣器深度解析:从无源/有源原理到PWM驱动与实战应用

1. 从“滴滴”声到复杂旋律:蜂鸣器的世界远比你想的丰富说起蜂鸣器,你可能觉得它是个再简单不过的小玩意儿——电脑开机时那一声“滴”,微波炉完成加热后的提示音,或者老式闹钟那恼人的“哔哔”声。在很多人的印象里,它…

📅 2026/9/16 5:40:03
MORE NEWS

更多资讯

📰

Ubuntu 22.04 安装 librealsense 完整指南:源码编译 5 步拿到第一路深度流

Ubuntu 22.04 安装 librealsense 完整指南:源码编译 5 步拿到第一路深度流 【免费下载链接】librealsense RealSense SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense librealsense 即 RealSense SDK 2.0,是面向 RealSense 深…

📰

PTO-ISA 位运算指令 TOR 详解:Tile 逐元素按位或的原理、语法与实战

PTO-ISA 位运算指令 TOR 详解:Tile 逐元素按位或的原理、语法与实战 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers hi…

📰

awesome-prompts 创意写作提示词实用指南:三步让初稿去掉 AI 味

awesome-prompts 创意写作提示词实用指南:三步让初稿去掉 AI 味 【免费下载链接】awesome-prompts Curated list of chatgpt prompts from the top-rated GPTs in the GPTs Store. Prompt Engineering, prompt attack & prompt protect. Advanced Prompt Engine…

📰

RxJS 6.x 到 7.x 升级全指南:官方变更清单逐项解读与迁移实战

RxJS 6.x 到 7.x 升级全指南:官方变更清单逐项解读与迁移实战 【免费下载链接】rxjs A reactive programming library for JavaScript 项目地址: https://gitcode.com/gh_mirrors/rx/rxjs 本指南以官方文档 6-to-7-change-summary.md 为骨架,逐条解…

📰

如何用quic-go快速部署HTTP/3服务器:配置项全解析与踩坑清单

如何用quic-go快速部署HTTP/3服务器:配置项全解析与踩坑清单 【免费下载链接】quic-go A production-ready QUIC implementation in pure Go 项目地址: https://gitcode.com/gh_mirrors/qu/quic-go 本文带你用 quic-go(一个纯 Go 编写、可直接用于…

📰

DDU显卡驱动彻底清理指南:从残留原理到重装避坑全解析

很多人一提到换显卡驱动就头大,尤其是那种“升级NVIDIA驱动后黑屏”“换了新显卡老驱动残留导致游戏闪退”“AMD显卡驱动控制面板突然打不开”的情况。折腾一圈发现,问题不是新驱动不行,而是旧驱动压根没卸干净。这时候就需要DDU(…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬