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:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

用户已经注册过

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

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

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

打赏作者

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

抵扣说明:

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

余额充值