DFT C 语言

DFT的计算公式

公式评论说有错

X ( k ) = ∑ n = 0 N − 1 x ( n ) e x p ( − j 2 Π / N ∗ n ∗ k ) X(k)=\sum_{n=0}^{N-1}{x(n)}exp(-j2\Pi/N*n*k) X(k)=n=0N1x(n)exp(j2Π/Nnk)

根据公式以及欧拉定理

e i x = c o s ( x ) + i ∗ s i n ( x ) e^{ix}=cos(x)+i*sin(x) eix=cos(x)+isin(x)

所以有

X ( k ) = ∑ n = 0 N − 1 x ( n ) ∗ ( c o s ( 2 ∗ Π / N ∗ n ∗ k ) + i ∗ s i n ( 2 ∗ Π / N ∗ n ∗ k ) ) X(k)=\sum_{n=0}^{N-1}x(n)*(cos(2*\Pi/N*n*k)+i*sin(2*\Pi/N*n*k)) X(k)=n=0N1x(n)(cos(2Π/Nnk)+isin(2Π/Nnk))

z = a + i ∗ b = a 2 + b 2 z=a+i*b=\sqrt{a^2+b^2} z=a+ib=a2+b2

代码

#include <stdio.h>//标准输入输出头文
#include<math.h>//声明了常用的一些数学运算
#define pi 3.1415
#define N 32//32个点

typedef struct
{
    double real,imag;
} complex;//复数 结构
complex dft_out[100];//单个点计算k
complex dft_one[100];//单个点计算n
double amp[N];//DFT后的结果
int main()
{
    int n,k;
    double xn;
    for(k=0; k<N; k++)//k循环
    {
        for(n=0; n<N; n++)//n循环
        {
            xn=cos(n*pi/6);//要DFT的信号
            dft_one[n].real=xn*cos(2*pi/N*n*k);//实部信号
            dft_one[n].imag=xn*sin(2*pi/N*n*k);//虚部信号
            dft_out[k].real+=dft_one[n].real;
            dft_out[k].imag+=dft_one[n].imag;//DFT后的实部,虚部相加
        }
        amp[k]=sqrt(dft_out[k].real*dft_out[k].real+dft_out[k].imag*dft_out[k].imag);//欧拉公式
        printf("%d  %f\n",k,amp[k]);
    }
}

gnuplot画图和matlab仿真结果

C:
在这里插入图片描述
matlab:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,下面是一个简单的DFT实现的示例代码,使用了C语言和汇编语言的混合编程,运行环境为CCSv5。 ```c #include <stdio.h> #include <math.h> #define N 16 // 信号长度 float x[N] = { 0.707, 0.707, 0.0, -0.707, -0.707, 0.0, 0.707, 0.707, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0 }; // 输入信号 float Xr[N], Xi[N]; // 输出实部和虚部 void dft(float *xr, float *xi, float *Xr, float *Xi) { int k, n; float arg; float cosarg, sinarg; for (k = 0; k < N; k++) { Xr[k] = 0; Xi[k] = 0; for (n = 0; n < N; n++) { arg = -2 * M_PI * k * n / N; cosarg = cos(arg); sinarg = sin(arg); asm("fmacs %0, %1, %2" : "+r"(Xr[k]) : "r"(xr[n]), "f"(cosarg)); // 计算实部 asm("fmacs %0, %1, %2" : "+r"(Xi[k]) : "r"(xr[n]), "f"(sinarg)); // 计算虚部 } } } int main() { int i; // 计算DFT dft(x, NULL, Xr, Xi); // 输出结果 for (i = 0; i < N; i++) { printf("X[%2d] = %8.4f + %8.4fj\n", i, Xr[i], Xi[i]); } return 0; } ``` 代码中使用了C语言编写的DFT函数,以及使用了汇编语言的乘法和加法指令来计算每个频率分量的实部和虚部。 需要注意的是,在CCSv5中,需要将汇编代码嵌入到C语言中,使用`asm`关键字来标识。在汇编代码中,可以使用`%0`、`%1`、`%2`等符号来表示C语言中的变量。`fmacs`指令表示浮点数乘加运算,其语法为`fmacs Rd, Ra, Rb`,表示将Ra和Rb相乘,并将结果加到Rd中。在本例中,将实部和虚部分别计算,所以使用了两条`fmacs`指令。 需要注意的是,本例中只实现了DFT的正变换,如果需要实现IDFT的逆变换,可以将代码中的`-2 * M_PI`改为`2 * M_PI`即可。 希望这个示例代码能够对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用户已经注册过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值