怎么给AD DA的结果做fft(快速傅立叶变换)是初学AD DA的人常问的一个问题。这也难怪,一般的模拟书上不怎么提这个事情,我只记得baker的第二册上有一部分内容讲这个。其实要理解了这里的道理,就发现这也不是太神秘的一件事情。fft其实就是对一个信号做傅立叶分析,但是与傅立叶分析不同,一是它是将信号离散化,二是加了快速算法。通常的傅立叶分析用的是一个信号的全部时间信息,但是离散傅立叶变换(
DFT)就只用了一些时间间隔上的信号信息。这样做可以适应计算机,但是也有一个问题就是有混叠效应(alias)。要避免混叠,就必须满足采样频率大于二倍最大信号频率。但在实践中,这个也只能改成尽可能大于(为什么)。如果对DFT在计算过程中运用一些技巧,就能使速度提高很多,这就被成为快速傅立叶变换。而这些技巧也不是随便能用的,这就引入了我们下面提出的一个约束。
对AD做fft,其实比较直观。AD本身就是对输入信号采样的,所以只需要把输出的数字信号做成数组,去做fft。某些做模拟的似乎对离散信号没有感觉,非要把这个数字信号再用DAC传成模拟量,然后做分析,这就等于又绕了一圈。如果是仿真,等于多加了一个仿真器件拖累。当然在实践中我也可以理解,因为如果用caculator做fft分析,就只能这样。但是如果用matlab做分析,就没这个必要了。对于实际测试,如果没有逻辑分析仪,只有频谱分析仪,也只能这么绕一圈测试,这属于没有办法,但是在具体测试中得注意DAC的引入实际对AD的结果是有影响的,所以这种比较适合精度不高的AD。还有些人概念如果不清,没有注意到DAC的结果并不完全是ADC的结果的复制,那就有可能把DA的问题认为是AD的问题。
要做好fft,第一个要求是采样的点数必须是2^N。其实这条如果违反了也并不是罪不可赎。因为这是为了使得fft能够实现快速算法的一个约束。如果违反了,第一,现在电脑速度这么快,第二,fft算法本身在进步,2^N是最优,但也有一些次优的选择,第三,有时候我们分析的点数并不多,所以违反了也不是犯了天条。不过建议还是用这个最优的约束条件,有时候能把30s的分析时间缩短到1s(假如分析的点数很多,又不是那么优化)。
第二个要求,是在分析的时间内有M个被分析信号周期,M应该与2^N互质。这个要求我认为基本上应该算是天条,特别是如果要考虑谐波之类。为什么?首先说必须要有整数个周期,根据fft的性质,被分析信号的能量就会集中在第M个bin上。如果违反了这个,能量就会分散在多个相邻的bin上,形成频谱泄漏,大家可以看看那时fft的结果,信号就像一个大斜坡,一直向两边延伸,淹没了其他bin上的信号。其次,这个M必须和2^N互质。如果不这样,M的整数倍信号就会落在几个固有的bin上。对于AD,其量化噪声实际并不是真正的噪声,而是和信号同周期的。所以一般我们只有用互质的做法,才能将量化噪声打散,显现出真正的谐波。当然也有例外,有时为了突显量化噪声,专门不采用互质的做法,这也是有实例的。所以关键还是了解背后的原因。
前面说的在仿真中很容易满足。但在测试中却未必容易,主要是由于第二条中对信号频率有严格要求,而且这个频率一定要与ADC的采样频率同步。所以就有一个加窗的概念。加窗实际是信号与系统里的一个概念,主要目的就是当信号不在一个bin上时,让这个信号的主要能量占据的bin尽可能少。但是这里也有一个矛盾,不同的窗,如果信号主要能量占据的bin比较少,信号在这几个bin外的的能量就比较大。反之信号主要能量占据的bin比较多,信号在这几个bin外的能量就比较小。所以需要根据需要加不同的窗。
在仿真中也碰到信号频率算的很严格,但仿真后依然有频谱泄漏,这个应该是仿真器有计算误差造成的,那时还是要加窗。
上面说的是AD的仿真,测试结果做fft。对于DA,有另外一个特性。DA的结果是个连续量,切换过程也是有意义的,这和AD不同。因此在DA的一个时钟内必须采足够多的点才行,如果一个周期只猜一个点那是远远不行的。