前面的两个部分分别完成了信号的抽样以及DFT的计算,都是为了使用DFT得到信号的幅度谱。要得到信号的幅度谱,我们指需要对一个信号进行抽样然后计算其DFT的结果既可。
我们需要分析的信号为:幅度为0.6,频率分别为50Hz与500Hz,采样率为8000的正弦波信号的相加。
程序代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.1415926535
struct data
{
double real,imag;
};
int main()
{
int N=8000; //序列长度
double Squence[8000]; //序列
double Amplitude[8000]; //幅值
struct data one[8000]; //单个数据
struct data sum; //求和的结果
int n;
int k; //表示第k个数
double t,f; //信号的时间 频率
//将采样信号存到Sequence[k]里面
for(k=0;k<N;k++)
{
t=k/8000.0;
f=0.6*(sin(2*PI*500*t)+sin(2*PI*50*t));
Squence[k]=f;
}
//进行DFT计算,并输出结果
for(k=0;k<N;k++)
{
//对sum赋初值
sum.real=0;
sum.imag=0;
//计算第k个点处的幅值
for(n=0;n<N;n++)
{
one[n].real = cos(2*PI/N*k*n)*Squence[n]; //实部
one[n].imag = -sin(2*PI/N*k*n)*Squence[n]; //虚部
sum.real += one[n].real; //实部求和
sum.imag += one[n].imag; //虚部求和
}
Amplitude[k] = sqrt(sum.real*sum.real+sum.imag*sum.imag); //计算幅值 sqrt(a^2+b^2)
printf("%.6f %.16f\n",k/8000.0,Amplitude[k]); //输出计算结果
}
return 0;
}
gnuplot作图命令
cd path
tcc dft2.c -o dft2.exe
dft2.exe > dft2.dat
gnuplot
plot "dft2.dat" w l
作图结果