C语言实现DFT计算

简介: 本文主要介绍了利用C语言实现DFT计算的思路并给出了程序设计

一、DFT计算公式

这里就不对DFT概念进行叙述,直接上计算公式
39aeaa49c4bbbb23c216e40fc5c6e495_de463496991e41189ac1c99dfc57b71e.png

其中N为DFT点数。

公式如此,但是在程序中并非如此运算,而是利用欧拉公式对DFT的计算公式进行了转化
607515e78679f67849c953c8dfb5fecc_be6eff85961f41edb6f838d86150769f.png

转换后公式变为
ac70d22d833a997540619f0546196667_3215f9009e1a40df95a7df76c15e1d9c.png

利用转化后的公式进行程序编写就变得思路清晰起来。

在进行频谱分析时有一个概念叫做频谱分辨率,其计算公式如下:
1f146ab3a0166271ff7bfabb75036c21_42d9abb0376042319c01ee9f11657811.png

∆f为频谱分辨率,N为采样点数,Ts为采样时间间隔,fs为采样频率

比如频谱分辨率为50Hz,那么计算结果中第一个频点(k=1)时对应为50Hz分量,第二个频点(k=2)时对应为100Hz分量,依此类推。k=0时为直流分量。

二、DFT程序实现

按照惯例,直接上程序

#define Pi   3.1416   // DFT计算时的Π值
/*
 *==============================================================================
 *函数名称:Dft_Calculate
 *函数功能:计算DFT
 *输入参数:Input:数据数组   N:DFT点数,Num:获取前Num个频点
 *输出:前Num频点的幅值
 *返回值:无
 *============================================================================*/
void Dft_Calculate(int Input[],int N,int Num)
{
    int n = 0;   // 计算单个点DFT的循环变量
    int k = 0;   // 计算全部点DFT的循环变量
    double Real[N],Imag[N];
    double Real_Sum = 0;   // 存储实部的和
    double Imag_Sum = 0;   // 存储虚部的和

    double Dft_Result[N];   // 存储DFT结果
    // 测试一下int和double的误差

    for (k = 0;k < Num;k ++)
    {
        for (n = 0;n < N;n ++)
        {
            Real[n] = cos(((2*Pi)/N)*n*k)*Input[n];
            Imag[n] = -sin(((2*Pi)/N)*n*k)*Input[n];

            Real_Sum = Real_Sum + Real[n];   // 实部求和
            Imag_Sum = Imag_Sum + Imag[n];   // 虚部求和
        }
        Dft_Result[k] = sqrt(Real_Sum * Real_Sum + Imag_Sum * Imag_Sum);
        Real_Sum = 0;
        Imag_Sum = 0;   // 初始化计算值
    }
}

该函数逻辑简单,注释明确,这里就不再赘述了。主要功能是输入需要求DFT的数组Input后,输入DFT点数以及想获取的结果长度,即可计算DFT结果值。

值得注意的是该函数计算结果是一个局部变量,在计算完成后会被释放。如果在计算完成后需要对计算结果进行进一步操作,可以将存储计算结果的数组定义放在函数外面。

相关文章
|
8月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
65 0
|
8月前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
1月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
2月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
134 4
|
7月前
|
存储 C语言
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
|
7月前
|
存储 安全 C语言
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
|
7月前
|
存储 C语言
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
|
7月前
|
C语言
C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
|
7月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
130 2
|
7月前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)