动态测试信号采集仿真与实例分析
- 格式:pdf
- 大小:745.63 KB
- 文档页数:20
3.5 OpenCV 的图像处理应用
OpenCV 是由 Intel 公司资助的开源计算机视觉库。它由一系列 C 函数和少量 C++类构 成,实现图像处理和计算机视觉方面的很多通用算法。 OpenCV 包括 300 多个 C/C++函数的跨平台的中、 高层 API。 它不依赖于其他的外部库, [5] 但是也可以使用某些外部库 。 本课程设计是需要用到相当少量的函数即可, 首先是创立相应的图像文件, 然后根据得 到的频率数据画相应的柱状图即可。
1、引言
快速傅里叶变化(FFT)在动态测试信号的频谱分析中起到至关重要的作用,将时域信 号的点通过 FFT 的计算可以转换复平面中得点,计算复数的模和相位角,可以绘制出动态 测试信号的幅频特性曲线和相频特性曲线,从而进行深入分析。但是无论是 DFT 还是 FFT 得到的幅值谱都是离散谱线,如果分析的点数是 N,信号采样频率为 fs 时,频线间隔即频率 分辨率为 fs/N,这就是频谱分析中的梳妆效应[1]。如果周期信号的频率正好对正某一谱线时, 则得到的频率、幅值和相位都是准确的。在通常情况下,信号频率在二条谱线之间,没有对 正主瓣中心,由于峰值谱所反应的频率和幅值都不准确,相位的误差更大。所以,对于动态 测试信号的频谱分析需要相应的校正算法。
3.2 快速傅里叶变换(FFT)
连续函数的傅里叶变换是波形分析的有力工具, 但为了使之用于计算机技术, 必须将连 续变换变成离散变换, 这样就必须引入离散傅里叶变换的概念。 离散傅里叶变换在数字信号 处理和数字图像处理中都得到了十分广泛的应用, 它在离散时域和离散频域之间建立了联系。 如果直接应用卷积和相关运算在时域中处理,计算量将随着取样点数 N 的平方而增加,这 使计算机的计算量迅速增大,耗时增多,很难道达到海量数据处理的要求。因此提出快速傅 里叶变换,先开辟储存空间用以保存加权系数 Wi 及中间变量,然后采用频率分解法进行蝶 形运算, 最后重新排列序列顺序得到最终结果。 这样快速傅里叶变换大大节约了运算时间[2]。 C++代码如下:
2.2 基于计算机的声信号采集与分析
通过计算机上的麦克风及声卡与 AD,录制各人在不同环境噪声、不同发声状态下讲话
“机械工程测试与控制技术”语句(不少于 3 次,最好是他人的声音) ,利用软件转换语音 数据文件为 ASCII 码,然后利用 2.1 的软件进行频谱分析,画出时域、频域图形。并讨论: 1)该设置至少为多少的采样频率?采样长度多长合适? 2)不同人员讲话 声音的时域、频域有什么区别?根据你的分析,该怎样区分不同人的 讲话声音? 3)要使他人不易识别你的讲话声音,该怎么处理?
:110 :114 :116 :118 :11C :120 :122 :124 :124 :128 :12C :124 (:132)
“FMT”块大小 编码类型标识 声道数 采样频率 数据量 采样大小 采样位数 系统预留 “FACT”块表识 “FACT”块大小 “FACT”数据 “DATA”块表识 “DATA”块大小
2、项目设计任务
2.1 信号仿真、采集与分析
利用 Matlab 或 C 语言产生信号, x(t) = α1 sin(2π������1 t + φ1 ) + α2 sin(2π������2 t + φ2 ) + α3 sin(2π������3 t + φ3 ) + ������(������) 其中: ������1 = 50������������、������2 = 200������������、������3 = 1000������������; ������(������)为白噪声, 均值为零, 方差为 0.7; 幅值、相位任意设定; 对上述等式进行 DFFT 处理后,讨论: 1)通过设置不同的采样频率,画出时域波形和傅里叶变换后讨论采样点数一定的情况 下,如 1024 点,采样频率对信号时域复现、频域分析的影响; 2)采样频率、采样长度(采样点数)与频率分辨率的关系; 3)通过设置不同幅值的信号与噪声,讨论噪声对信号时域分析和频域分析的影响。
动态测试信号采集仿真与实例分析
02009516 曹旻灿 指导老师 贾民平
摘要: 现实生活中采集到信号都是时域信号, 虽然这种以时间作为独立变量的方式能够反映 信号幅值随时间变化的关系, 但是不能揭示信号的频率结构特征。 为了更加全面深入研究信 号,从而获得更多有用的信息,常常利用傅里叶变化把时域描述的信号转化为频域信号。随 着电子计算信息技术的发展, 普通的离散傅里叶变化已经不再适用于数字计算机, 另一种称 为快速傅里叶变化的算法被广泛应用。 本文主要对三种不同的动态测试信号进行采集, 在基 于 C++的程序语言环境中对其进行分析后, 发现一次离散傅里叶变化存在频率、 幅值和相位 都存在误差。最终提出频率相位校正算法。 关键词:频谱分析;离散傅里叶变化;快速傅里叶变化;幅值校正;C++
void DFFT(Cnum *t,Cnum *f,int r) { long count;//傅里叶变换点数 int i,j,k,p,bfsize; Cnum *w,*x,*a,*b;//复数结构的指针,其中 w 指向加权系数 double angle; //计算加权系数的角度值 count=1<<r; //计算傅里叶变换点数 ////////////分配所需空间////////////////////// w=new Cnum[count/2]; a=new Cnum[count]; b=new Cnum[count]; ///////////计算加权系数////////////////////// for(i=0;i<count/2;i++)
4、主程序的构建
4.1 类的构建
根据课程设计的任务,对相应环节进行设计,设计了以下几个类: Cnum 复数类 对数据进行复数域的计算和分析; Messurenum 数据检测类 根据函数自己产生数据或从文本读取数据并做相应转换; WaveHeader WAV 文件类 用于读取 WAV 格式文件中的数据 Picture 图像类 用于画时域波形,频域图像等。 4.1.1 复数类 class Cnum//定义复数类 { private: double real; //实部 double image; //虚部 public: Cnum(double r=0.0,double i=0.0){real=r;image=i;}//构造函数 Cnum operator+(Cnum c2); //+重载为成员函数 Cnum operator-(Cnum c2); //-重载为成员函数 Cnum operator*(const Cnum& other); //重载乘法 void operator=(const Cnum& other);//重载等号 void display(); double Realout(void){return real;}//输出实部 double Imageout(void) {return image;}//输出虚部 double Rangeout(void);//输出幅度 double Phaseout(void);//输出相位 }; 4.1.2 数据检测类 class Messurenum//定义数据检测类 { private: int count; double t; //横坐标值 double Xnum; //时域值 double Random(double min,double max);//平均分布随机值算法 double gauss(double x,double miu,double sigma); //正态分布函数 double AsctoDB(char *word);//ASCII 码转 double 值 int end_flag; public: std::vector<double> Txtnum; Messurenum(int x=0,double y=0.0,double z=0.0){count=x;t=y,Xnum=z;end_flag=0;} // 构造函数 void Generate(int tcount,double timed);//实验任务 1 double GaussRandom(double miu,double sigma,double min,double max); //高斯白噪声 函数
表 1:PCM 格式的 WAV 文件头
相对偏移 地址 :100 :104 :108 :10C
描述 “RIFF”文件头 文件大小 “WAVE”文件头 “FMT”辨别码
8 位采样 4 字节 4 字节 4 字节 4 字节
16 位采样 4 字节 4 字节 4 字节 4 字节
说明 “RIFF”的 ASCII 码 整个 WAV 文件的大小 标识此文件为 WAV 格式 标识 WAV 文件的两个基本块之一 的“fmt”块开始(注意字符最后 以空格结束) 净长度, 不包括辨别码和块大小占 用的 8 字节 使用何种编码类型 FCM:0100;ADPCM:0200 单声道:0100;立体声:0200 每秒取多少个采样点 每秒记录的数据量,单位:字节 每个采样点数据占用多少比特 系统用多少位表征一个采样点 全部置零,仅 8 位采样文件有 “fact” 的 ASCII 码, 表示 “FACT” 块开始 不包括表识和快大小 标识 WAV 文件的两个基本块之 二: “data”块开始 数据区大小
{
angle=-i*pai*2/count; w[i]=Cnum(cos(angle),sin(angle));}
memcpy(a,t,sizeof(Cnum)*count); //////////采用频率分解法进行蝶形算法/////////// for(k=0;k<r;k++) { for(j=0;j<1<<k;j++) { bfsize=1<<(r-k); for(i=0;i<bfsize/2;i++) { p=j*bfsize; b[i+p]=a[i+p]+a[i+p+bfsize/2]; b[i+p+bfsize/2]=(a[i+p]-a[i+p+bfsize/2])*w[i*(1<<k)]; }} x=a;a=b;b=x; for(j=0;j<count;j++) { p=0; for(i=0;i<r;i++) if(j&(1<<i)) p+=1<<(r-i-1); f[j]=a[p]; } /////////释放空间//////////////////// delete w; delete a; delete b; } } ///////////将乱序的变换序列重新排列//////////// 字节 4 字节 2 字节 2 字节 2 字节 4 字节 4 字节 4 字节 4 字节 4 字节