数字信号处理的步骤与注意事项,并编写1024个采样点的FFT C语言程序
- 格式:doc
- 大小:653.50 KB
- 文档页数:17
快速傅里叶变换FFT的C语言实现及应用快速傅里叶变换(Fast Fourier Transform, FFT)是一种快速计算离散傅里叶变换(Discrete Fourier Transform, DFT)的算法。
它能够在较短时间内计算出巨大数据集的傅里叶变换,广泛应用于信号处理、图像处理、通信等领域。
C语言是一种广泛应用于嵌入式系统和科学计算的编程语言,拥有高效、灵活和可移植等特点。
下面将介绍FFT的C语言实现及应用。
首先,我们需要了解离散傅里叶变换的定义。
离散傅里叶变换将一组离散的时域信号转换成一组对应的频域信号,可以表示为以下公式:X(k) = Σ[ x(n) * W^(kn) ]其中,X(k)是频域信号,x(n)是时域信号,W是单位复数旋转因子,其计算公式为W=e^(-j*2π/N),其中j是虚数单位,N是信号的长度。
实现FFT算法的关键在于计算旋转因子的值,一种常用的计算方法是采用蝶形算法(butterfly algorithm)。
蝶形算法将DFT分解成多个子问题的求解,通过递归调用可以快速计算出结果。
以下是一种基于蝶形算法的FFT实现的示例代码:```c#include <stdio.h>#include <math.h>typedef structfloat real;float imag;if (N <= 1)return;}for (int i = 0; i < N/2; i++)even[i] = signal[2*i];odd[i] = signal[2*i + 1];}fft(even, N/2);fft(odd, N/2);for (int k = 0; k < N/2; k++)signal[k].real = even[k].real + temp.real;signal[k].imag = even[k].imag + temp.imag;signal[k + N/2].real = even[k].real - temp.real; signal[k + N/2].imag = even[k].imag - temp.imag; }int maiint N = sizeof(signal) / sizeof(signal[0]);fft(signal, N);printf("频域信号:\n");for (int i = 0; i < N; i++)printf("%f + %fi\n", signal[i].real, signal[i].imag);}return 0;```以上代码实现了一个简单的4点FFT算法,输入时域信号为{1,0,1,0},输出为对应的频域信号。
基2时间抽取1024点FFT流图源程序:#include<stdio.h>#include<math.h>#define pi 3.1415926#define N 10 //二进制位数#define K 10 //总级数#define L 1024 //点数struct Plural{ float R;float I; };//计算2的i次方intSquareI( inti ){int j;if(i==0) j=1;else for(j=1;i;i--)j=j*2;return j;}void WM(int e[],int k){inti,j,B,b;for(i=0;i<L;){B= SquareI(k);b= SquareI(k-1);if((i%B)==b){for(j=0;j<b;j++,i++)e[i]=j*SquareI(N-k);}else {e[i]=0;i++;}}}//计算旋转因子voidTwiddleFactor(intn,int e[],struct Plural Wn[]){ inti;for(i=0;i<L;i++){Wn[i].R=cos(2.0*pi*(e[i])/n);Wn[i].I=sin(-2.0*pi*(e[i])/n);}}//复数乘积voidPluralMultiple(struct Plural a[],struct Plural b[]){inti;float R,I;for(i=0;i<L;i++){R=a[i].R*b[i].R-a[i].I*b[i].I;I=a[i].R*b[i].I+a[i].I*b[i].R;a[i].R=R;a[i].I=I;}}voidnextarray(struct Plural x[],int k){inti,j,B,b;float R,I;for(i=0;i<L;){B= SquareI(k);b= SquareI(k-1);if((i%B)==0){for(j=0;j<b;j++,i++){R=x[i].R+x[i+SquareI(k-1)].R;I=x[i].I+x[i+SquareI(k-1)].I;x[i+SquareI(k-1)].R=x[i].R-x[i+SquareI(k-1)].R;x[i+SquareI(k-1)].I=x[i].I-x[i+SquareI(k-1)].I;x[i].R=R;x[i].I=I;}}else { i++;}}}//FFT倒序intFFTReverse( int k ){inti,j,a[N],b[N],kk,sum;for(i=0;i<N;i++){a[i]=k%2;k=k/2;}for(i=N-1,j=0;j<N;j++,i--){b[j]=a[i];}for(i=0,kk=0; i<N;i++){sum=SquareI(i); kk=kk+b[i]*sum;}returnkk;}//输入数组序列转换voidarrayFFTReverse(struct Plural y[],struct Plural x[]) {inti,kk;for(i=0;i<L;i++){kk=FFTReverse(i);x[kk].R=y[i].R;x[kk].I=y[i].I;}}//给数组赋值voidValuationCos(struct Plural Wn[]) //cos[k] { inti;for(i=0;i<L;i++){Wn[i].R=cos(2.0*pi*i/L);Wn[i].I=0;}}voidValuationRn(struct Plural Wn[]) //Rn[k] { inti;for(i=0;i<L;i++){Wn[i].R=1;Wn[i].I=0;}}voidValuationSin(struct Plural Wn[]) //sin[k] { inti;for(i=0;i<L;i++){Wn[i].R=sin(2.0*pi*i/L);Wn[i].I=0;}}void ValuationUnitimpluse(struct Plural Wn[]) //δ[k] { inti;Wn[0].R=1;Wn[0].I=0;for(i=1;i<L;i++){Wn[i].R=0;Wn[i].I=0;}}void main(){intll=0,i,k,e[L];struct Plural Wn[L],x[L];char c;printf("基2时间抽取1024点FFT流图\n\n");for(;;){printf("1.cos[k] 2.sin[k] 3.δ[k] 4.Rn[k] \n\n选择序号:");scanf(" %c",&c);switch(c){case '1':{ValuationCos(Wn);printf("\ncos[k]\n\n");break;}case '2':{ValuationSin(Wn);printf("\nsin[k]\n\n");break;}case '3':{ValuationUnitimpluse(Wn);printf("\nδ[k]\n\n");break;}case '4':{ValuationRn(Wn); printf("\nRn[k]\n\n");break;}default :{ValuationCos(Wn);printf("\ncos[k]\n\n");break;}}//数组转换arrayFFTReverse(Wn,x); //这里使用Wn[]是为了减少数组的个数,且Wn[]只是临时的for(k=1;k<=K;k++) //产生K级计算{WM(e, k); //产生Wn的上标TwiddleFactor(L,e,Wn); //产生Wn数组的值PluralMultiple(x,Wn); //计算x[]与Wn[]的复数相乘,结果放在x[]nextarray(x,k); //计算x[]加减,结果放在x[]}printf("结果\n\n");for(i=0;i<L;i++){if(x[i].I<0)printf("X[%d]=%1.0f%1.0fj\t",i,x[i].R,x[i].I);elseprintf("X[%d]=%1.0f+%1.0fj\t",i,x[i].R,x[i].I);ll++;if(ll==5) //每行输出5个{printf("\n");ll=0;}}printf("\n");}}。
数字信号处理实验<第八章FFT)一、实验内容针对典型序列,用C语言编程实现基2-FFT,并与MATLAB自带的FFT函数的计算结果进行比较。
二、实验工具1.VC++6.02.matlab2018三、实验涉及知识图1按时间抽选的基2—FFT算法根据蝶形运算图,如图1,可以看出,一个点基2-FFT运算由n级蝶形运算构成,每一个蝶形结构完成下属基本迭代运算:式中m表示第m列迭代,k,j为数据所在行数。
上式的蝶形运算如图2所示。
图2四、实验设计思路首先,根据基2-FFT的算法特点,可以整理出程序设计的大致思路。
基2-FFT主要运用的就是蝶形运算来降低进行DFT运算时的运算量。
因为是基2,所以进行DFT计算的点数N必须的。
程序设计中主要解决3个问题,变址运算,复数运算,节点距离运算,及旋转因子的计算。
下面对这三个模块进行说明。
1.变址运算由蝶形图我们可以看出,FFT的输出X(k>是按正常顺序排列在存储单元中,即按X(0>,X(1>,…,X(7>的顺序排列,但是这时输入x(n>却不是按自然顺序存储的,而是按x(0>,x(4>,…,x(7>的顺序存入存储单元,所以我们要对输入的按正常顺序排列的数据进行变址存储,最后才能得到输出的有序的X(K>。
通过观察,可以发现,如果说输出数据是按原位序排列的话,那么输入数据是按倒位序排列的。
即如果输入序列的序列号用二进制数,则到位序就为。
我们需将输入的数据变为输出的倒位序存储,这里用雷德算法来实现。
下面给出雷德算法。
假如使用A[I]存的是顺序位序,而B[J]存的是倒位序。
例如 N = 8 的时候,倒位序顺序二进制表示倒位序顺序0 0 000 0004 1 100 0012 2 010 0106 3 110 0111 4 001 1005 5 101 1013 6 011 1107 7 111 111由上面的表可以看出,按自然顺序排列的二进制数,其下面一个数总是比其上面一个数大1,即下面一个数是上面一个数在最低位加1并向高位进位而得到的。
一、对FFT的介绍1. FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。
2.FFT算法的基本原理FFT算法是把长序列的DFT逐次分解为较短序列的DFT。
按照抽取方式的不同可分为DIT-FFT(按时间抽取)和DIF-FFT(按频率抽取)算法。
按蝶形运算的构成不同可分为基2,基4,基8,以及任意因子的类型。
3.迭代关系4、本次程序的基本过程我们这次所研究的是数字信号处理中的FFT算法,我们这次所用的数字信号是复数类型的。
(1)所以首先,我们先定义了一个复数结构体,因为是进行复数的运算,我们又相继定义复数的加减乘运算的函数。
(2)紧接着,我们定义了进行FFT计算的fft()快速傅里叶变换函数initW() 初始化变换核函数即旋转因子的计算,change() 变址函数,output()输出傅里叶变换的结果的函数。
(3)定义主函数,并调用定义好的相关子函数,利用fft()中的蝶形运算以及change()函数来完成从时间域上选取的DIT-FFT。
二、FFT中码位倒置排序1、码位倒置的实现方法:(1)简单的利用按位与、或循环实现(2)利用公式推导的迭代方法2、为什么要进行码位倒置因为由于FFT的计算特性,如果按照正常顺序输入,而没有进行码位倒置的话,就会以乱序输出,就不便于我们后续对信号的相关性质进行研究了,所以DIT-FFT算法就是在进行FFT计算之前,进行分奇偶后的码位倒置运算,即二进制数的倒位。
3、倒位序由奇偶分组造成,以N=8为例,说明如下:三、蝶形运算由按照上述公式的规律进行逐级分解,直到2点DFT,如下是N=8时的蝶形算法分析图:四、FFT算法中蝶形算法的基本思想分析(1)我们知道N点FFT运算可以分成log2(N)级,每一级都有N/2个碟形,FFT的基本思想是用3层循环完成全部运算(N点FFT)。
C语言实现FFT快速傅里叶变换(Fast Fourier Transform, FFT)是一种高效进行离散傅里叶变换(Discrete Fourier Transform, DFT)计算的算法。
它通过利用对称性和递归的方法,将O(n^2)的计算复杂度优化为O(nlogn)。
本文将介绍C语言实现FFT的基本步骤和代码。
首先,需要定义一个复数结构体来表示复数,包含实部和虚部两个成员变量:```ctypedef structdouble real; // 实部double imag; // 虚部```接着,需要实现FFT的关键函数,包括以下几个步骤:1. 进行位逆序排列(bit-reversal permutation):FFT中的输入数据需要按照位逆序排列,这里使用蝶形算法来实现位逆序排列。
先将输入序列按照索引位逆序排列,再将复数序列按照实部和虚部进行重新排列。
```cint i, j, k;for (i = 1, j = size / 2; i < size - 1; i++)if (i < j)temp = data[j];data[j] = data[i];data[i] = temp;}k = size / 2;while (j >= k)j=j-k;k=k/2;}j=j+k;}```2. 计算旋转因子(twiddle factor):FFT中的旋转因子用于对复数进行旋转变换,这里采用的旋转因子为e^( -2*pi*i/N ),其中N为DFT点数。
```cint i;double angle;for (i = 0; i < size; i++)angle = -2 * M_PI * i / size;twiddleFactors[i].real = cos(angle);twiddleFactors[i].imag = sin(angle);}```3.执行蝶形算法计算DFT:蝶形算法是FFT算法的核心部分,通过递归地将DFT问题一分为二,并将计算结果根据旋转因子进行两两合并,最终得到FFT结果。
DSP 课程作业用C 语言编写FFT 程序1,快速傅里叶变换FFT 简介快速傅氏变换(FFT ),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
我们假设 x(n)为N 项的复数序列,由DFT 变换,任一X (m )的计算都需要N 次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的X (m ),即N 点DFT 变换大约就需要N^2次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT 中,利用WN 的周期性和对称性,把一个N 项序列(设N=2k,k 为正整数),分为两个N/2项的子序列,每个N/2点DFT 变换需要(N/2)2次运算,再用N 次运算把两个N/2点的DFT 变换组合成一个N 点的DFT 变换。
这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。
继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算,N 在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT 的优越性。
2,FFT 算法的基本原理FFT 算法的基本思想:利用DFT 系数的特性,合并DFT 运算中的某些项,吧长序列的DFT —>短序列的DFT ,从而减少其运算量。
FFT 算法分类:时间抽选法DIT: Decimation-In-Time ;频率抽选法DIF: Decimation-In-Frequency按时间抽选的基-2FFT 算法1、算法原理设序列点数 N = 2L ,L 为整数。
数字信号处理的步骤与注意事项,并编写1024个采样点的FFT C语言程序1. 数字信号处理1.1 数字信号处理概述数字信号处理是研究如何用数字或符号序列来表示信号以及如何对这些序列进行处理的一门学科。
随着计算机技术的发展,数字信号处理技术得到了越来越广泛的应用,它已成为现代科学技术必不可少的工具。
数字信号是数据序列,其处理实际上就是进行各种数学运算,如加、减、乘以及各种逻辑运算等等。
因此,数字信号处理既可以是软件处理也可以是硬件处理。
所谓软件处理,就是对所需要的运算编制程序,然后在计算机上实现,其处理灵活、方便。
所谓硬件处理,就是用加法器、乘法器、延时器以及它们的各种组合来构成数字电路,以实现所需要的运算。
硬件处理显然不如软件处理灵活方便,但能对数字信号进行实时处理。
近年来日益广泛采用的各种数字信号处理器(如TI TMS320系列、Philps Trimedia系列等)可以认为是软硬件处理方式的结合,这种处理时用数字信号处理芯片以及存储器来组成硬件电路,所需要的运算靠特定的汇编语言编程来实现。
因此,采用数字信号处理器既方便灵活,又能做到实时处理,所以数字信号处理器(DSP)已经越来越广泛地应用于包括通信在内的各个领域之中。
1.2 数字信号处理的优点(1)精度高数字系统的特性不因环境的变化而变化,计算精度是模拟系统所无法相比的,运算位数由8位提高到16位、32位、64位。
(2)可靠性高模拟系统中各种参数受温度、环境影响较大,因而易出现感应、杂散效应,甚至会出现震荡等等;而数字系统受温度、环境影响较小。
模拟信号受到干扰即产生失真,而数字信号由于只有两种状态,因此,所受的干扰只要在一定范围以内,就不会产生影响,这就是说,数字信号抗干扰能力强。
另外,如果用数字信号进行传输,在中继站还可以再生。
总的说来,信号的数字处理可靠性高。
(3)灵活性强可以通过改变数字信号系统的参数来改变系统的性能。
数字信号的灵活性还表现在可以利用一套计算设备同时处理多路相互独立的信号,即所谓的“时分复用”,这在数字电话系统中是非常有用的技术。
数字信号处理算法的使用注意事项与傅里叶分析数字信号处理(DSP)算法是处理数字信号的数学和计算方法。
它在许多领域中发挥着重要作用,包括通信、音频处理和图像处理等。
然而,在使用DSP算法时需要注意一些关键事项,以确保正确有效地处理信号。
本文将介绍一些使用DSP算法的注意事项。
首先,确保信号采样率正确。
采样率是指在单位时间内对信号进行采样的次数。
在使用DSP算法之前,必须明确信号的采样率,以便正确地对信号进行处理。
如果采样率设置不正确,可能会导致信号失真或信息丢失。
因此,在开始处理数字信号之前,需要了解信号的采样率,并将其作为算法输入的参数。
其次,选择适当的滤波器。
滤波器是DSP算法中的关键组件,用于去除信号中的噪声或不需要的频率成分。
选择适当的滤波器可以有效地提取所需信号,并减少干扰。
常见的滤波器类型包括低通、高通、带通和带阻滤波器。
在选择滤波器时,需要考虑信号的频率范围和所需滤波器响应的特点。
另外,合理选择傅里叶变换类型。
傅里叶变换是一种将信号从时域转换为频域的数学方法。
常用的傅里叶变换类型包括离散傅里叶变换(DFT)和快速傅里叶变换(FFT)。
DFT适用于对离散信号进行频谱分析,而FFT则是对连续信号进行频谱分析的快速算法。
在选择傅里叶变换类型时,需要根据信号类型和分析需求进行合理选择。
此外,注意对信号进行预处理。
信号预处理是在应用DSP算法之前对信号进行一系列操作,以准备信号进行处理。
常见的信号预处理方法包括去噪、均衡和幅度归一化等。
预处理可以提高信号的质量,并减少算法处理过程中的误差。
因此,在使用DSP算法时,应注意对信号进行适当的预处理。
最后,进行正确的结果解释和验证。
在使用DSP算法之后,需要正确解释和验证处理结果。
结果的解释需要考虑领域专业知识和特定应用的需求。
验证结果可以通过与已知结果对比、模拟实验等方式来实现。
确保结果的正确性和可靠性是使用DSP算法的关键。
总结起来,使用DSP算法时需要注意信号的采样率、滤波器选择、傅里叶变换类型、信号预处理和结果解释与验证等关键事项。
fft c语言程序快速傅里叶变换(Fast Fourier Transform,FFT)是一种计算机算法,它能够将一个离散的时间域信号转换为频谱域信号。
FFT算法是一种高效的计算傅里叶变换的方法,可以大大加快计算速度。
FFT算法是由高效的分治策略设计得来的。
它将傅里叶变换的计算分解为多个较小规模的子问题,然后逐步合并这些子问题的计算结果,最终得到原始问题的解。
因此,FFT算法的时间复杂度为O(n log n),其中n表示信号的长度。
相比之下,传统的傅里叶变换算法的时间复杂度为O(n^2),因此FFT算法在处理大规模信号时具有较大的优势。
在C语言中,我们可以使用库函数来实现FFT算法。
这些库函数通常提供了一些基本的操作,例如初始化FFT对象、进行离散傅里叶变换、进行逆变换等。
以下是一个简单的C语言程序,用于实现FFT算法:```c#include <stdio.h>#include <stdlib.h>#include <math.h>#include <complex.h>//计算离散傅里叶变换void fft(double complex buf[], int n){if (n <= 1)return;double complex *even = malloc(n / 2 * sizeof(double complex));double complex *odd = malloc(n / 2 * sizeof(double complex));for (int i = 0; i < n / 2; i++){even[i] = buf[2 * i];odd[i] = buf[2 * i + 1];}fft(even, n / 2);fft(odd, n / 2);for (int k = 0; k < n / 2; k++){double complex t = cexp(-I * 2 * M_PI * k / n) * odd[k]; buf[k] = even[k] + t;buf[k + n / 2] = even[k] - t;}free(even);free(odd);}//打印复数数组void print_complex(double complex buf[], int n){for (int i = 0; i < n; i++){printf("%.2f + %.2fi\n", creal(buf[i]), cimag(buf[i]));}}int main(void){int n = 8;double complex buf[] = {1.0 + 0.0 * I, 1.0 + 0.0 * I, 1.0 + 0.0 * I, 1.0 + 0.0 * I,0.0 + 0.0 * I, 0.0 + 0.0 * I, 0.0 + 0.0 * I, 0.0 + 0.0 * I};fft(buf, n);print_complex(buf, n);return 0;}```这个程序定义了两个函数:`fft`和`print_complex`。
数字信号处理的步骤与注意事项,并编写1024个采样点的FFT C语言程序1. 数字信号处理1.1 数字信号处理概述数字信号处理是研究如何用数字或符号序列来表示信号以及如何对这些序列进行处理的一门学科。
随着计算机技术的发展,数字信号处理技术得到了越来越广泛的应用,它已成为现代科学技术必不可少的工具。
数字信号是数据序列,其处理实际上就是进行各种数学运算,如加、减、乘以及各种逻辑运算等等。
因此,数字信号处理既可以是软件处理也可以是硬件处理。
所谓软件处理,就是对所需要的运算编制程序,然后在计算机上实现,其处理灵活、方便。
所谓硬件处理,就是用加法器、乘法器、延时器以及它们的各种组合来构成数字电路,以实现所需要的运算。
硬件处理显然不如软件处理灵活方便,但能对数字信号进行实时处理。
近年来日益广泛采用的各种数字信号处理器(如TI TMS320系列、Philps Trimedia系列等)可以认为是软硬件处理方式的结合,这种处理时用数字信号处理芯片以及存储器来组成硬件电路,所需要的运算靠特定的汇编语言编程来实现。
因此,采用数字信号处理器既方便灵活,又能做到实时处理,所以数字信号处理器(DSP)已经越来越广泛地应用于包括通信在内的各个领域之中。
1.2 数字信号处理的优点(1)精度高数字系统的特性不因环境的变化而变化,计算精度是模拟系统所无法相比的,运算位数由8位提高到16位、32位、64位。
(2)可靠性高模拟系统中各种参数受温度、环境影响较大,因而易出现感应、杂散效应,甚至会出现震荡等等;而数字系统受温度、环境影响较小。
模拟信号受到干扰即产生失真,而数字信号由于只有两种状态,因此,所受的干扰只要在一定范围以内,就不会产生影响,这就是说,数字信号抗干扰能力强。
另外,如果用数字信号进行传输,在中继站还可以再生。
总的说来,信号的数字处理可靠性高。
(3)灵活性强可以通过改变数字信号系统的参数来改变系统的性能。
数字信号的灵活性还表现在可以利用一套计算设备同时处理多路相互独立的信号,即所谓的“时分复用”,这在数字电话系统中是非常有用的技术。
(4)便于大规模集成化数字部件具有高度的规范性,易于实现大规模集成化和大规模生产,数字系统体积小、重量轻。
(5)数字信号便于加密处理由于数字信号实际上为数据序列,因此便于加密运算处理。
(6)对于低频信号尤其优越处理低频信号的模拟元件如电感、电容等一般都体积较大、制作不易、适用不便。
如果转换成数字信号来进行处理,由于频率低,对数字部件的速度要求不高,因而容易实现。
数学处理当然也有不足之处。
目前,数字系统的速度还不能达到处理很高频率信号(例如射频信号)的要求。
但随着大规模集成电路、高速数字计算机的发展尤其是微处理器的发展,数字系统的速度将会越来越高,数字信号处理也会越来越显示出其优越性。
1.3 数字信号处理的步骤数字信号处理系统的框图,如图1所示:图1 数字信号处理系统框图由图1可知,数字信号处理主要有预处理、采样与A/D转换和计算机处理三大步骤。
(1)预处理预处理包括:a.隔离信号中的直流分量(如果所测信号中不应有直流分量)。
b.若信号经过调制,则应先行解调。
c.电压幅值调理,以便适宜于采样。
总是希望电压幅值峰—峰值足够大,以便充分利用A/D转换器的精度。
如12位的A/D转换器,其参考电压为±5V,若信号电平较低,转换后二进制数的高位都为0,仅在低位有值,其转换后的信噪比将很差,若信号电平绝对值超过5V,则转换中又将发生溢出,这是不允许的。
所以进入A/D的信号电平应适当调整。
(2)采样与A/D转换必要的滤波比提高信噪比,并滤去信号中的高频噪声。
采样与A/D转换包括采样、保持和量化。
(3)数字信号处理数字信号处理包括截断、加权、数字滤波和计算机信号分析四部分。
计算机只能处理有限长度的数据,所以首先要把长时间的序列截断,对截取的数字序列有时还要人为地进行加权(乘以窗函数)以成为新的有限长的序列。
对数据中的奇异点(由于强干扰或信号丢失所引起的数据突变)应予以剔除。
对温漂、时漂等系统性干扰所引起的趋势项(周期大于记录长度的频率成分)也应予以分离。
如有必要,还可以设计专门的程序来进行数字滤波。
然后把数据按给定的程序运行运算,完成各种分析。
1.4 数字信号处理的注意事项(1)采样间隔采样间隔的选择是一个重要的问题。
采样间隔太小(采样频率高),则对定长的时间记录来说其数字序列就很长,计算工作量迅速增大;如果数字序列长度较短,则只能处理较短的时间历程,可能产生较大的误差。
若采样间隔过大(采样频率低),则可能丢掉有用的信息,同时采样间隔过大还会引起混叠现象。
因此采样频率通常选为(3~4)f(h f为信号的最高频率)。
h(2)截断、泄露和窗函数截断就是讲信号乘以时域的有限宽矩形窗函数,由于窗函数是一个无限宽带的sinc函数,所以信号在截断后也必然成为无限宽带的信号,这种信号的能量在频率轴分布扩展的现象成为泄露,故信号截断必然导致误差。
为了减小截断的影响,常采用其他的时窗函数来对所截取的时域信号进行加权处理。
所选的窗函数应力求其频谱的主瓣宽度窄些、旁瓣幅度小些。
2.快速傅里叶变换(FFT)2.1 叶变换简介快速傅里有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965 年,Cooley 和Tukey 提出了计算离散傅里叶变换(DFT)的快速算法,将DFT 的运算量减少了几个数量级。
从此,对快速傅里叶变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT 的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基-2DIT 和基-2DIF。
FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
快速傅立叶变换作为一种数学方法,已经广泛地应用在几乎所有领域的频谱分析中,而且经久不衰,因为信号处理方法没有先进和落后之分,只有经典和现代之别,在实际系统中用得最好的方法就是管用的方法。
换句话说,信号处理方法与应用背景和目的的贴近程度是衡量信号处理方法优劣的唯一标准。
FFT 是快速傅利叶变换(Fast FourierTransform 简称FFT)的英文缩写,它在当今科技世界中的应用相当活跃,无论是在时间序列分析领域中,还是在我国刚刚兴起的生物频谱治疗的研究与应用中,都有着重要的作用。
同时,它又是软件实现数字滤波器的必备组成部分之一。
FFT 算法的基本思想:利用DFT 系数的特性,合并DFT 运算中的某些项,把长序列的DFT —>短序列的DFT ,从而减少其运算量。
FFT 算法分类: 时间抽选法DIT: Decimation-In-Time ; 频率抽选法DIF: Decimation-In-Frequency 。
在此以按时间抽选的基-2FFT 算法为例进行说明。
2.2 算法原理N 为2 的整数幂的FFT 算法称基-2FFT 算法。
设N 点序列()x n ,n =0,1,2,…N-1 按n 的奇偶分成两个长为N/2的序列12()(2)()(21)x r x r x r x r ==+ r =0,1,2,…,2N -1由于2/2N N W W =则()x n 的DFT :111()()()()N N N nk nk nk NNNn n n X k x n Wx n Wx n W---=====+∑∑∑n 为偶数 n 为奇数=11222(21)00(2)(21)N N rk r k N Nr r x r W x r W--+==++∑∑=11221/22/20()()N N rk k rk N N N r r x r W W x r W --==+∑∑=12()()kN X k W X k + k =0,1,2,…,N-1 (1)其中:1()X k =12/20(2)N rk N r x r W -=∑=121/20()N rk N r x r W -=∑ (2)2()X k =12/20(21)N rk N r x r W -=+∑=122/20()N rk N r x r W -=∑ (3)按式(1)计算得到的只是()X k 的前一半项数的结果,即(0≤k ≤2N —1)。
由系数的周期性可推出()X k 的后一半值,即(2N ≤k ≤N —1):.(/2)/2/2r k N r k N NW W += (/2)/2k N k N k N N NNW W W W +=⋅=- (/2N N W =—1)又因为1()X k ,2()X k 是以2N 为周期的,可推出: 1122(/2)11/21/210(/2)()()()N N r k N rk N N r r X k N x r Wx r WX k --+==+===∑∑ (4)同理可得,2(/2)X k N +=2()X k (5) 由此可得N 点对应的DFT ()X k 的计算式子:1212()()()(/2)()()kN k NX k X k W X k X k N X k W X k =++=- k =0,1,2,…,2N -1 (6)上一式计算()X k 的前一半值,下一式计算()X k 的后一半值。
因此只要求出0~2N —1区间内各个整数k 值所对应的1()X k 和2()X k ,便可求出0到N-1点全部的()X k 值。
明显节约了运算量。
式中因子k N W 在复数乘法中起一个旋转的作用,称为旋转因子。
公式(6)的运算可以归结为两个复数a 、b 求得复数k N a bW +和k N a bW -。
用信号流程图的方法可以简单的表示为如图2所示。
这样的运算称为蝶形运算,在FFT 算法中占有核心的地位。
图2 时间抽选蝶形运算流图显然,每个蝶形运算对应于一次复数乘法和两次复数加法运算。
如果用DFT 方法直接计算出1()Xk 和2()Xk ,共需22N 次复数乘法运算,再作N/2次蝶形运算,又需N/2次复数乘法和N 次复数加法。
这样算出N 点DFT 共需要(2N +N )/2次复数乘法和(2N /2)+N 次复数加法。
当N 较大时,同直接计算N 点DFT 所需的2N 次复数乘加次数相比,几乎减少了一半的计算量。
假设N/2还是偶数,则1()Xk 和2()X k 这两个N/2点的DTF 计算,又分别可以通过计算N/4点DFT 和蝶形运算而得到。