技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5387|回复: 6
收起左侧

【C】C语言写的FFT算法的DLL(快速傅里叶变换)

[复制链接]

1088

主题

2606

帖子

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
236
威望
474 点
宅币
21372 个
贡献
45937 次
宅之契约
0 份
在线时间
2060 小时
注册时间
2014-1-26
发表于 2014-5-21 18:54:07 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
所谓FFT在声音方面的应用就是,你给一个波形数据,它帮你从波形数据中判断各个频率波形的数量和振幅,也就是分频、频谱分析。
MP3的编码就是把WAV无损进行频谱分析,取得其中各个频段声波的量,进行筛选然后存储。因此MP3可以在损失音质的情况下把一首音乐压缩成较小的文件。
GoldWave这款软件右边的频谱图和声谱图就是用FFT算法算出来的,如下图。
GW.PNG
大家可以通过看播放的时候各频段声波出现的范围和次数来判断你正在播放的音乐的音质。上图是无损。如果是320K的话,高音部分会有损失。如果是128K的话,那么大范围的声音部分都有损失。
这篇帖子将提供一个DLL给大家使用。这个DLL的作用是,你提供一段声波的数据(double浮点数数组),然后它还原这个声波数据的频谱。
此DLL只导出一个函数:FFT(32位_stdcall,可供VB等语言使用。)
原型:
[C] 纯文本查看 复制代码
//=============================================================================
//FFT:
//快速傅里叶变换算法实现。
//FFTSize:输入的波形数组的元素数和输出的复数数组的元素数。
//pWAVEIn:输入的波形数组指针
//pFFTOut:输出的FFT变换结果的虚数数组指针
//doInverse:是否做反转。
//返回实际处理的波形样本数量。
//-----------------------------------------------------------------------------
FFT_FUNC(unsigned)FFT
(
    unsigned    FFTSize,
    CxFloatP    pWAVEIn,
    ComplexP    pFFTOut,
    int         doInverse
);
其中CxFloatP是这样定义的:
[C] 纯文本查看 复制代码
typedef double CxFloat,*CxFloatP;
然后ComplexP是这样定义的:
[C] 纯文本查看 复制代码
#pragma pack(push,1)//统一字节对齐

typedef struct
{
    CxFloat R;//实数部分
    CxFloat I;//虚数部分
}Complex,*ComplexP;//复数

#pragma pack(pop)
我承认我本人没有弄懂原理。我是从网上下载VB的代码,然后用自己的代码风格重写了一遍,编译了一个DLL。
最后运算的结果存储在Complex数组里。调用此函数的时候,pWAVEIn是CxFloat数组的指针,是输入的波形数据。 pFFTOut是Complex数组的指针,输出的虚数存储了频谱信息。CxFloat数组和Complex数组元素的个数都必须等于FFTSize的值。
得到的Complex数组经过计算它的模(复数的模的计算方法和二维向量的模的计算方法是一样的:平方根(实数部分×实数部分+虚数部分×虚数部分))可以得到频谱信息。注意Complex数组是左右对称的,意思是,模(pFFTOut[i ])==模(pFFTOut[FFTSize-1-i])
源码和下载地址回复可见。
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

回复

使用道具 举报

1

主题

4

帖子

44

积分

用户组: 初·技术宅

UID
287
精华
0
威望
1 点
宅币
38 个
贡献
0 次
宅之契约
0 份
在线时间
4 小时
注册时间
2014-5-14
发表于 2014-5-21 19:02:30 | 显示全部楼层
顶一个 话说这界面类似GoldWave 不会是下的部份源码吧

1088

主题

2606

帖子

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
236
威望
474 点
宅币
21372 个
贡献
45937 次
宅之契约
0 份
在线时间
2060 小时
注册时间
2014-1-26
 楼主| 发表于 2014-5-21 21:26:19 | 显示全部楼层
jiu63577 发表于 2014-5-21 11:02
顶一个 话说这界面类似GoldWave 不会是下的部份源码吧

没仔细看帖子内容,警告一次
1、这个就是GoldWave的界面,不是我的程序,我的程序是DLL。
2、请仔细看标题,我给的不是界面,而是一个实现FFT算法的DLL。
3、这个FFT算法的原理是参考的一个VB的代码。我的程序和GoldWave没有半点关系。

3

主题

24

帖子

191

积分

用户组: 小·技术宅

UID
204
精华
1
威望
10 点
宅币
137 个
贡献
5 次
宅之契约
0 份
在线时间
13 小时
注册时间
2014-4-14
发表于 2014-5-22 14:21:52 | 显示全部楼层
FFT算法是一个蝶形的算法,其核心是分治,将其中重叠的部分只计算一次达到O(nlogn)的时间复杂度。该算法的用处非常大,他是整个信号处理的最重要组成部分,是空间域、时域,向频域转换的方法,当然,用到卷积或者多项式计算时,它可以将计算的复杂度降低。

评分

参与人数 1威望 +2 宅币 +10 收起 理由
KxIX + 2 + 10 优秀回复

查看全部评分

0

主题

25

帖子

22

积分

用户组: 初·技术宅

UID
3072
精华
0
威望
0 点
宅币
-3 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2017-11-10
发表于 2017-11-12 20:10:38 | 显示全部楼层
niubiniubiniubi

0

主题

1

帖子

11

积分

用户组: 初·技术宅

UID
4910
精华
0
威望
0 点
宅币
10 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2019-5-2
发表于 2019-5-2 20:08:39 | 显示全部楼层
谢谢大佬,正在学习FFT方面的知识

0

主题

1

帖子

16

积分

用户组: 初·技术宅

UID
7325
精华
0
威望
1 点
宅币
13 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2021-8-5
发表于 2021-8-5 19:00:09 | 显示全部楼层
厉害啊 A5
回复

使用道具 举报

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2021-10-29 05:10 , Processed in 0.046718 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表