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]的加工
#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
- C & MATLAB语言实现信号的DFT
- 用c语言实现的dft逆变换
- Matlab实现DFT
- DFT的AS2实现
- matlab实现信号的变换
- matlab实现信号的变换
- C语言信号实现时钟
- C语言实现matlab的butter函数
- 一维DFT C实现
- 正余弦信号的DFT频谱分析
- C语言实现信号打包成二进制文件并在Matlab中读取并画图(VS版)
- C语言实现简单的守护进程及信号处理
- 【matlab】DFT滤波的基本步骤
- C语言的中断信号
- matlab IIr C语言实现
- 信号的采样以及matlab实现
- matlab的函数conv()的C语言实现
- C语言实现MATLAB 6.5中M文件的方法
- 论如何写出高效优美的C语言代码
- Visual Studio
- 印度心急如焚:不能打仗 与中国定边界
- 进程的虚拟地址映射
- 世界都乱套了:除了中国其他大国都在死磕
- C & MATLAB语言实现信号的DFT
- 数据结构与算法-----快速排序
- 中国买苏35贵了5亿美元?答案让你明白中方用心
- ORA-00911: 无效字符 问题和解决
- 中国空军驱鸟新利器:遥控航模空中开火(高清图)
- Linux常用命令小结(一)
- 内部排序之冒泡算法
- IOS 数据存储(一)
- SVN回滚版本