频谱分析仪模拟仿真设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.专业整理.
数字信号处理课程设计
题目:频谱分析仪模拟仿真
专业:电子信息工程
班级:
:
日期:2015-03-26
目录
1.设计目的
------------------------------------------------------------------------1
2.程序流程
------------------------------------------------------------------------2
3.软件设计
------------------------------------------------------------------------3
4.心得体会
------------------------------------------------------------------------4
5.参考文献
------------------------------------------------------------------------5
一、设计目的
1、通过对频谱分析仪的模拟掌握其基本原理和基本功能;
2、学习掌握用计算机输出基波包括:方波、正弦波、余弦波等;
3、掌握倒位序、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)的原理及算法;
4、分别用DFT和FFT分析比较32位方波序列对比,体会快速算法的意义;
5、学会用turbo c编程软件并且对c语言编程算法进行实践,加深理解。
二、软件设计
1、方波8位加DFT抽样
#include <stdio.h>
#include <math.h>
#define N 8
#define PI 3.1415926
int sam[8];
void sample()
{
int i,j;
printf("抽样结果:\n");
for(i=0;i<N;i++)
{
if(i<N/2)
{
j=1;
sam[i]=j;
printf("sam[%d]=%d ",i,j);
}
if(i>=N/2)
{
j=-1;
sam[i]=j;
printf("sam[%d]=%d ",i,j);
}
}
printf("\n");
}
void DFT()
{
int k,n,a;
float sum1=0,sum2=0;
float xi[N],xj[N],xk[N];
printf("DFT变换结果:\n");
for(k=0;k<N;k++)
{
for(n=0;n<N;n++)
{
xi[n]=sam[n]*cos(-(2*PI/N)*k*n);
sum1+=xi[n];
xj[n]=sam[n]*sin(-(2*PI/N)*k*n);
sum2+=xj[n];
}
xk[k]=sqrt(sum1*sum1+sum2*sum2);
sum1=0;
sum2=0;
}
for(a=0;a<N;a++)
{
printf("X[%d]=%f ",a,xk[a]);
}
printf("\n");
}
void main()
{
sample();
DFT();
}
截图
2、方波32位程序
#include <stdio.h> void main()
{
int i,a,N;
N=32;
for(i=0;i<N/2;i++) {
a=1;
printf("%d ",a); }
for(i=N/2;i<N;i++) {
A=-1
printf("%d ",a);
}
system("pause");
}
软件截图
2、DFT程序
#include<stdio.h> #include<math.h> void main()
{
float t,re=0,im=0,sum,mod,P=3.1415926; int n,k,N=32,*x;
for(n=0;n<N/2;n++)
{
x[n]=1;
}
for(n=N/2;n<N;n++)
{x[n]=-1;}
for(k=0;k<N;k++)
{
for(n=0;n<N;n++)
{
t=(-2*P/N)*n*k;
re+=x[n]*cos(t);
}
for(n=0;n<N;n++)
{
t=(-2*P/N)*n*k;
im+=x[n]*sin(t);
}
sum=re*re+im*im;
mod=sqrt(sum);
printf("x[%d]=%f,\n",k,mod);
re=0,im=0;sum=0;mod=0;
}
}
软件截图
3、倒位序程序
#include<stdio.h>
#include<math.h>
#define N 32
void main()
{
int nv2,nm1,i,k,j=0,x[100],t; nv2=N/2;
nm1=N-1;
printf("请输入自然序:\n"); for(i=0;i<N;i++)
scanf("%d",&x[i]);
for(i=0;i<nm1;i++)
{
if(i<j)
{
t=x[j];
x[j]=x[i];
x[i]=t;
}
k=nv2;
while(k<=j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
printf("输出倒位序:\n");
for(j=0;j<N;j++)
printf("%d ",x[j]);
printf("\n");
}
软件截图
4、FFT程序
#include <stdio.h>
#include <math.h>
struct cmplex
{
float r;
float i;
};
struct cmplex ss(struct cmplex a1,struct cmplex a2) {
struct cmplex c;
c.r=a1.r*a2.r-a1.i*a2.i;
c.i=a1.r*a2.i+a1.i*a2.r;
return(c);
}
void main()
{
int i,k,N=32,nv,nm,j=0,m,le,le0,ip;
float pai=3.1415926,tmp,sum,*a;
struct cmplex u,w,t,x[32];
for(i=0;i<N;i++)
{
x[i].r=1;
x[i].i=0;
}
for(i=N/2;i<N;i++)
{
x[i].r=-1;
x[i].i=0;
}
nv=N/2;
nm=N-1;
for(i=0;i<nm;i++)
{
if(i<j)
{
t=x[j];
x[j]=x[i];
x[i]=t;
}
k=nv;
while(k<=j)
{
j-=k;
k=k/2;
}
j+=k;
}
for(m=1;m<=5;m++)
{
le=pow(2,m);
le0=le/2;
u.r=1;
u.i=0;
tmp=pai/le0;
w.r=cos(-tmp);
w.i=sin(-tmp);
for(j=0;j<le0;j++)
{
for(i=j;i<N;i+=le)
{
ip=i+le0;
t=ss(x[ip],u);
x[ip].r=x[i].r-t.r;
x[ip].i=x[i].i-t.i;
x[i].r+=t.r;
x[i].i+=t.i;
}
u=ss(u,w);
}
}
printf("\n");
for(i=0;i<N;i++)
{
sum=x[i].r*x[i].r+x[i].i*x[i].i;
a[i]=sqrt(sum);
printf("a[%d]=%f\n",i,a[i]);
}
}
软件截图
三、心得体会
该实验巩固了我们上学期所学的数字信号处理和信号与系统知识,通过C语言上机操作仿真信号,不仅能够加深我们对各种信号抽样和变换的认识,也能让我们真真切切体会到计算机仿真系统带给我们学生和技术人员的巨大便利。
总而言之,本次DSP仿真为我们以后在信号领域的探索和研究打下了良好的基础。
四、参考文献
1、程佩清《数字信号处理教程》清华大学出版社 2013 第四版
2、王宝祥《信号与系统》工业大学出版社(修订版)
3、谭浩强《C语言程序设计》清华大学出版社 2008 第二版。