C & MATLAB语言实现信号的DFT

来源:互联网 发布:大数据精准营销的案例 编辑:程序博客网 时间:2024/05/01 02:30
#include<math.h>
#include<stdio.h>
#define PI 3.14159265
#define N 8
void DFT_caculate(double *signal,double *Xk);
struct complex_num
{
double real;
double imag;
};  //定义结构体类型
 
int main()
{
int n,k;
double signal[N] = {0};
double Xk[N] = {0};
for(n = 0;n < N;n ++)
{
signal[n] = sin(2*PI*n/N);
printf("%lf ",signal[n]);
}
printf("\n");
DFT_caculate(signal,Xk);
for(n = 0;n < N;n ++)
{
printf("%lf ",Xk[n]);
}
return 0;
}
//对信号进行DFT 
void DFT_caculate(double *signal,double *Xk)
{
complex_num data[N] = {0};  //定义结构体类型complex_num的结构体数组data[N]用来处处DFT后的实部和虚部 
int n,k;   
for(k = 0;k < N;k ++)
for(n = 0;n < N;n ++)
{
data[k].real = data[k].real + signal[n]*cos(2*PI/N*n*k); //DFT实部 
data[k].imag = data[k].imag + signal[n]*sin(2*PI/N*n*k); //DFT虚部  
}
for(k = 0;k < N;k ++)
{
Xk[k] = sqrt(data[k].real * data[k].real + data[k].imag * data[k].imag);
}  // Xk[k]是DFT后实部平方虚部平方和在开方之后的值,是double类型
}
/*
首先输入信号 信号定义为double类型
exp(-j*2*PI/N)*n*K可以利用欧拉公式转换为 cos(2*PI/N*n*k) - j*sin(2*PI/N*n*k)
因此信号乘以cos(2*PI/N*n*k)就是对信号进行DFT的实部,乘以sin(2*PI/N*n*k)就是DFT的虚部
用data[k]来进行存储,data[k]定义为 complex_num数据类型,complex_num.real就是double类型的
complex_num.imag也是double数据类型 
最后的变换之后的序列Xk[k]来存储,是DFT后实部平方虚部平方和在开方之后的值,是double类型 
double Xk[N] = {0};中 Xk[N]用来存储变换后的数据,在main()函数中定义,传递给 DFT_caculate()函数
的形参,在函数中就会对Xk[N]中的数字进行加工处理, Xk[N]中的数值已经被修改,因此函数退出后,
Xk[N]中的数值已经被改变,不需要函数中有返回值,但是也可以返回Xk[N],传入Xk[N],返回Xk[N]
函数体是对Xk[N]的加工 

*/ 

MATLAB代码

function DFT(xn)
    N = length(xn);
    n = 0:N-1;
    k = 0:N-1;
    Wn = exp(-j*2*pi/N);
    nk = n'*k;
    Wnnk = Wn.^nk;
    xk = xn*Wnnk
    figure
    stem(k,abs(xk));
    grid on;
    title('序列的离散傅里叶变换');
    xlabel('k');ylabel('x(k)');
    grid on;
end



0 0
原创粉丝点击