XilinxFPGAFFT应用笔记系统工作环境:芯片为:xilinxSpartan6软件:ise12.2IPcoreFFT版本:7.1目标:完成对放大板的标定一、标定的过程简单介绍:放大板包含3级程控放大器的放大电路、4个可选择的高频滤波器、1个50Hz的工频滤波器,放大板主要是针对低频信号,放大频率范围:0-20KHz,标定示意图:放大器板ADS127424位ADSpartan6FPGAAD5664r16位DA放大器控制模拟输出数字输出控制信号电压输出offset电压输出低通滤波◎offset调节:控制放大板的输入接地,将放大器的放大倍数设置为1000倍,测试AD的输出电压是否为0V,如果不是,则说明放大器内部有直流偏置,通过调节DA的offset输出电压,使得放大板在输入为0v时,输出也为0v。◎直流标定:直流标定挺简单的,让DA输出固定的电位,设置放大器的倍数,看看输出是否与理论值一致。例:输入为0.1mv,放大倍数为1000倍,检查输出是否为:0.1V,目的主要是为了检查放大板对直流的响应。◎交流标定:交流标定比较复杂,为了测量放大板对交流信号的响应,主要体现在放大器对信号的相频与幅频特性。◎具体的做法:FPGA控制DA产生一个正弦波,再通过AD采集放大后的数据,并对其做FFT(快速傅里叶变换),计算出信号的相位与幅度,与输入的波形对比,检测放大板的对交流信号的响应。例:①输入f=1Hz,A=10mv,Phase=0°的正弦波,测量输出的信号的A、Phase、f。②输入f=2Hz,A=10mv,Phase=0°的正弦波,测量输出的信号的A、Phase、f③输入f=3Hz……………⑩输入f=2000Hz……其实简单点,就是一个频谱分析仪,求放大板的频谱图,看看放大器对交流信号有没有产生频移与幅度的衰减。二、FGPA的工作◎控制放大器,简单的IO应用◎驱动ADS1274◎驱动AD5664r◎在内部生成一个DDS(直接数字频率合成器),输出频率、相位可调的正弦波。◎对AD采集的数据进行FFT的转换。三、DFT(离散傅里叶变换)的理解3.1傅里叶变换的基础知识其实,大学的时候几乎每个童鞋都学过傅里叶变换,应该算是必修的课程,但是当时我也就为考试,背背公式,不知道大家是什么心情,但是没有想过有一天居然真的用到了,表示很无力啊。在网上找了一下资料,也看了一些书。把一些感觉好的东西记录一下,加上自己的一些理解。傅立叶是一位法国数学家和物理学家的名字,英语原名是:JeanBaptisteJosephFourier(1768-1830)Fourier对热传递很感兴趣,于1807年在法国科学学会上发表了一篇论文,运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号可以由一组适当的正弦曲线组合而成。。举个的例子理解下:在数学上,关于一个信号最基本的问题在于如何将它表示和描述出来。按照上面所说的办法,把一个信号理解成一个定义在时间或空间上的函数是一种自然而然的表示方式,但是它对理解这一信号的内容来说常常不够。例如一段声音,如果单纯按照定义在时间上的函数来表示,它画出来是这个样子的:这通常被称为波形图。毫无疑问,它包含了关于这段声音的全部信息。但是同样毫无疑问的是,这些信息几乎没法从上面这个「函数」中直接看出来,事实上,它只不过是巴赫的小提琴无伴奏PartitaNo.3的序曲开头几个小节。下面是巴赫的手稿,从某种意义上说来,它也构成了对上面那段声音的一个「描述」:这两种描述之间的关系是怎样的呢?第一种描述刻划的是具体的信号数值,第二种描述刻划的是声音的高低(即声音震动的频率)。人们直到十九世纪才渐渐意识到,在这两种描述之间,事实上存在着一种对偶的关系,而这一点并不显然。根据原信号的不同类型,我们可以把傅立叶变换分为四种类别:四种不同信号的变换结果:摘自《数字信号处理》王世一。提问:数字信号处理只能处理离散的信号,所以在以上的4种情况中,只有第4种是可行的,但是同时也参生了一个问题,就是信号必须是周期的,但是在实际的数据中,不一定都是周期的啊,这个怎么办呢!以下是在《Digitalsignalprocessing》(一个老外写的特别好的书)的图,看完图后应该就能明白了。就是把有限长的信号进行复制,让其变成一个周期信号进行处理。说到这,上一下离散傅里叶级数的公式:上面是DFT的公式,至于怎么来的,我也尝试过搞明白,但是一头雾水,大致的情况是:221()()pptjmtatpXmxtedtt(连续周期信号的傅里叶变换)通过对连续的周期的信号的公式进行抽样处理,然后推到出来的,推的过程就很复杂了,也不太好理解。3.2这样理解DFT的公式(不知道对不对??)当我看到离散傅里叶级数的公式:我的第一个感觉就是,他代表的是什么意思啊,凭什么这个公式就是对的啊,怎么样理解这个公式呢。⑴先说说公式各项:◎x[i]:表示待处理的离散数据序列,其中i的范围为{0,N-1}◎Re[]Xk:Re是Real的缩写,表示实部(复数),[]Xk表示离散的频率序列,X表示周期信号,K的范围为{0,N-1}◎cos(2/)kiN:cos函数⑵公式的意义:任何连续周期信号可以由一组适当的正弦曲线组合而成。把连续改成离散的:任何离散周期信号可以由一组适当的离散正弦曲线组合而成。为什么可以算就是对的呢???在网上看到了这样一段话,感觉挺好的:傅立叶变换是一个数学上极为精美的对象:它是完全可逆的,任何能量有限的时域或空域信号都存在唯一的频域表达,反之亦然;它完全不损伤信号的内在结构;任何两个信号之间有多少相关程度(即内积);它们的频域表达之间也一定有同样多的相关程度;它不改变信号之间的关联性:一组信号收敛到一个特定的极限,它们的频域表达也一定收敛到那个极限函数的频域表达。那怎么计算相关性呢,在网上看见了一个很不错的例子:以下是他举的例子:利用第一种方法、信号的相关性(correlation)可以从噪声背景中检测出已知的信号,我们也可以利用这个方法检测信号波中是否含有某个频率的信号波:把一个待检测信号波乘以另一个信号波,得到一个新的信号波,再把这个新的信号波所有的点进行相加,从相加的结果就可以判断出这两个信号的相似程度。如下图:上面a和b两个图是待检测信号波,图a很明显可以看出是个3个周期的正弦信号波,图b的信号波则看不出是否含有正弦或余弦信号,图c和d都是个3个周期的正弦信号波,图e和f分别是a、b两图跟c、d两图相乘后的结果,图e所有点的平均值是0.5,说明信号a含有振幅为1的正弦信号c,但图f所有点的平均值是0,则说明信号b不含有信号d。这个就是通过信号相关性来检测是否含有某个信号的方法。通过上面的例子,可以进一步确定:任何两个信号之间有多少相关程度(即内积),它们的频域表达之间也一定有同样多的相关程度。再来个实际的例子:这个是圈圈写的,在此引用:一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加.n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。好了,说了半天,看着公式也晕,下面圈圈以一个实际的信号来做说明。假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。图1FFT结果从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看:1点:512+0i2点:-2.6195E-14-1.4162E-13i3点:-2.8586E-14-1.1898E-13i50点:-6.2076E-13-2.1713E-12i51点:332.55-192i52点:-1.6707E-12-1.5241E-12i75点:-2.2199E-13-1.0076E-12i76点:3.4315E-12+192i77点:-3.0263E-14+7.5609E-13i很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值,结果如下:1点:51251点:38476点:192按照公式,可以计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。附上自己对DFT的理解:。假设采样率为N,输入点的个数也为N,。根据奈奎斯特定理,DFT能分解出来的最高频率为:NHz,。分辨率为:1Hz,DFT的意义就是将:0Hz,1Hz,2Hz……N/2Hz的信号与输入的离散序列做内积,求每一个频率与输入的离散序列的相关程度。相关程度越大,表示这个频率的信号在组成输入序列的所有频率信号中占有的比重越大,他的幅值也越大。(不知道对不对??)3.3FFT与DFT快速傅氏变换(FFT)是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可