Skip to content

pure software Fast Fourier Transform with simple API.

License

Notifications You must be signed in to change notification settings

ZZH-Finalize/z-fft

Repository files navigation

z-fft

此仓库提供了一个简单易用的傅立叶变换库, 主要提供了9个接口, 分别为fftifftrfftirfftdftidftrdftirdftlength, 前8个都是进行傅立叶变换的接口, 最后一个是复数求模函数(用于计算幅度谱)

本仓库自带测试用例和demo程序, 例如complex_test.cbenchmark.cdemo.c

demo.c提供了实数傅里叶变换接口的用例, 此用例合成了一个包含三种频率的信号, 然后调用接口计算得到幅度谱, 再使用反变换接口将频谱还原回到原始信号, 并进行检查, 确保反变换还原的信号与原始信号是一致的, 此demo运行结果如下

第一段输出是幅度谱, 格式为[频率]: 信号强度

第二段输出是原信号和ifft重建的信号, 格式为orig: 原信号采样值, ifft: ifft重建的采样值

demo输出1
demo输出2

complex_test.cdemo.c类似, 不同之处在于, complex_test.c产生的是复数信号, 调用的也是复数变换的接口, 其余行为与demo.c一致

复数demo1
复数demo2

benchmark.c则提供了dftfft性能上的差异对比, 此测试案例分别调用dftfft的接口, 做相同的16384点的变换, 并统计两个算法使用的时间(单位为毫秒), 运行结果如下

性能对比

其中的数字单位为毫秒, 因此可以看出, dft花费了22492毫秒才计算完成, 而同样的数据量fft仅使用3毫秒

前文所述的8个接口可以大致分为fftdft两类, fft以及所有基于fft派生出来的接口均为基2的DIT算法实现的快速变换, 而dft以及所有基于dft派生出的接口均为傅立叶变换的定义式实现, 两大类在功能上并无差异, 但数据量较大时, fft这一类的要比dft这一类的运算速度快的多

接口的命名规则为:

  1. 变换对象为复数时, 直接使用算法名称, 变换对象为实数时, 在算法名称前增加字母r
  2. 正变换不加前缀, 反变换增加字母i前缀

因此, 8个接口的函数名与功能的对应关系如下

fft: 复数快速傅立叶变换(输入复数, 输出复数)
ifft: 复数快速傅立叶反变换(输入复数, 输出复数)

rfft: 实数快速傅立叶变换(输入实数, 输出复数)
irfft: 实数快速傅立叶反变换(输入复数, 输出实数)

dft: 复数傅立叶变换(输入复数, 输出复数)
idft: 复数傅立叶反变换(输入复数, 输出复数)

rdft: 实数傅立叶变换(输入实数, 输出复数)
irdft: 实数傅立叶反变换(输入复数, 输出实数)

所有的算法默认使用float作为基本数据类型, 也就是代码中的Number_t, 这一点可以通过上层构建系统传入宏定义进行修改, 例如CMake语句set(ZFFT_BASIC_TYPE double)可将数据类型重新定义为double

本仓库默认提供基于CMake的构建系统, 正常情况下, 此项目会将fft.c编译为动态库, 但也可以直接与其他代码链接到一起, 而其余文件编译为可执行文件. 所有的接口均在fft.c中实现, 在fft.h中声明, 其余文件则是调用接口实现的各种测试案例, 这些测试案例可直接由CMakectest框架执行并给出测试结果

如果你需要将本仓库集成到你的项目中, 有如下两种方案可选择:

  1. 若你自身项目已有与CMake不兼容的构建系统, 或你不想使用CMake, 则可以仅拷贝fft.hfft.cLICENSE三个文件, 将这三个文件放置在z-fft子目录下, 然后将fft.c加入到你的构建系统
  2. 若你的项目使用了CMake作为构建系统, 则可以直接将本仓库的文件下载下来(如果你使用git做版本控制, 则可以通过submodule的方式引入, 这种方式更好), 然后在上层CMakeLists.txt文件内使用add_subdirectory将本仓库添加到你的构建系统内

目前本仓库被项目信号实验箱使用, 该项目通过前文所述的第2种方式引入

About

pure software Fast Fourier Transform with simple API.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published