C语言 使用DFT得到信号幅度谱

前面的两个部分分别完成了信号的抽样以及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

作图结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值