FFT调试心得

合集下载

傅里叶变换学习心得体会

傅里叶变换学习心得体会

傅里叶变换学习心得体会篇一:《随机数字信号处理》学习心得体会随机数字信号处理是由多种学科知识交叉渗透形成的,在通信、雷达、语音处理、图象处理、声学、地震学、地质勘探、气象学、遥感、生物医学工程、核工程、航天工程等领域中都离不开随机数字信号处理。

随着计算机技术的进步,随机数字信号处理技术得到飞速发展。

本门课主要研究了随机数字信号处理的两个主要问题:滤波器设计和频谱分析。

在数字信号处理中,滤波技术占有极其重要的地位。

数字滤波是语音和图像处理、模式识别、频谱分析等应用中的一个基本处理算法。

但在许多应用场合,常常要处理一些无法预知的信号、噪声或时变信号,如果采用具有固定滤波系数的数字滤波器则无法实现最优滤波。

在这种情况下,必须设计自适应滤波器,以使得滤波器的动态特性随着信号和噪声的变化而变化,以达到最优的滤波效果。

自适应滤波器(adaptivefilter)是近几十年来发展起来的关于信号处理方法和技术的滤波器,其设计方法对滤波器的性能影响很大。

自适应滤波器是相对固定滤波器而言的,它是一种能够自动调整本身参数的特殊维纳滤波器。

自适应滤波算法的研究是自适应信号处理中最为活跃的研究课题之一,其中,两种最基本的线性滤波算法为:最小均方误差(lms)算法和最小二乘(rls)算法,由于lms算法具有初始收敛速度较慢、执行稳定性差等缺点,本门课着重介绍了rls算法。

rls算法的初始收敛速度比lms算法快一个数量级,执行稳定性好。

谱分析是随机数字信号处理另一重要内容,它在频域中研究信号的某些特性如幅值、能量或功率等随频率的分布。

对通常的非时限信号做频谱分析,只能通过对其截取所获得的有限长度的样本来做计算,其结果是对其真实谱的近似即谱估计。

现代谱估计算法除模型参量法之外,人们还提出了其它一些方法,如capon最大似然谱估计算法、pisarenk谐波分解法、music算法、esprit算法等利用矩阵的特征分解来实现的谱估计方法。

fft实验报告结果

fft实验报告结果

fft实验报告结果
《FFT实验报告结果:探索快速傅里叶变换的神奇魅力》
在现代科技领域,傅里叶变换(Fourier Transform)被广泛应用于信号处理、
图像处理、通信系统等各个领域。

而快速傅里叶变换(Fast Fourier Transform,FFT)作为一种高效的计算傅里叶变换的算法,更是被广泛使用。

本文将介绍一项关于FFT实验的报告结果,探索FFT的神奇魅力。

在实验中,我们选择了一组包含不同频率和幅度的信号进行FFT处理。

通过对
这些信号进行FFT分析,我们得到了它们在频域上的频谱图。

通过观察频谱图,我们可以清晰地看到信号中包含的各种频率成分,从而更好地理解信号的特性。

实验结果显示,FFT算法能够高效地计算出信号的频谱,并且能够准确地捕捉
到信号中的各种频率成分。

通过对频谱图的分析,我们可以得到信号的频率分
布情况,从而更好地了解信号的特性和结构。

除此之外,我们还对不同长度的信号进行了FFT处理,结果显示FFT算法在处
理不同长度的信号时依然能够保持高效性能。

这表明FFT算法具有很好的可扩
展性,能够适应不同长度的信号处理需求。

总的来说,通过这次实验,我们更加深入地了解了FFT算法在信号处理中的重
要性和优越性能。

FFT算法的高效性和准确性使其成为了信号处理领域中不可
或缺的工具,为我们提供了更好的信号分析和处理手段。

希望通过这次实验报告,能够让更多的人了解和认识FFT算法的神奇魅力,进一步推动其在各个领
域的应用和发展。

FFT实践及频谱分析实践报告

FFT实践及频谱分析实践报告

FFT实验一.内容1. 用Matlab产生正弦波,矩形波,以及白信号,并显示各自时域波形图;2. 进行FFT变换,显示各自频谱图,其中采样率,频率、数据长度自选;3. 做出上述三种信号的均方根图谱,以及对数均方根图谱;4. 用IFFT傅里叶反变换恢复信号,并显示恢复的正弦信号时域波形图;5.滤波器的设计。

(一).编写程序1.正弦波fs=100;%设定采样频率N=128;n=0:N-1;t=n/fs;f0=10;%设定正弦信号频率%生成正弦信号x=sin(2*pi*f0*t);figure(1);subplot(231);plot(t,x);%做正弦信号的时域波形xlabel('t');ylabel('y');title('正弦信号y=2*pi*10t时域波形');grid;%进行FFT变换并做频谱图y=fft(x,N);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(1);subplot(232);plot(f,mag);%做频谱图axis([0,100,0,80]);xlabel('频率(HZ)’);ylabel('幅值’);title('正弦信号y=2*pi*10t幅频谱图N=128’);grid;%求均方根谱sq=abs(y);figure(1);subplot(233);plot(f,sq);xlabel('频率(HZ)’);ylabel('均方根谱’);title('正弦信号y=2*pi*10t均方根谱’);grid;%求功率谱power=sq.^2;figure(1);subplot(234);plot(f,power);xlabel('频率(HZ)’);ylabel('功率谱’);title('正弦信号y=2*pi*10t功率谱’);grid;%求对数谱ln=log(sq);figure(1);subplot(235);plot(f,sq);xlabel('频率(HZ)’);ylabel('对数谱’);title('正弦信号y=2*pi*10t对数谱’);grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs;figure(1);subplot(236);plot(ti,magx);xlabel('t’);ylabel('y’);title('通过IFFT转换的正弦信号波形’);grid;2.矩形波fs=10;%设定采样频率t=-5:0.1:5;x=rectpuls(t,2);x=x(1:99);figure(2);subplot(231);plot(t(1:99),x);%作矩形波的时域波形xlabel('t');ylabel('y');title('矩形波时域波形');grid;%进行FFT变换并做频谱图y=fft(x);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(2);subplot(232);plot(f,mag);%做频谱图xlabel('频率(HZ)');ylabel('幅值');title('矩形波幅频谱图'); grid;%求均方根谱sq=abs(y);figure(2);subplot(233);plot(f,sq);xlabel('频率(HZ)');ylabel('均方根谱');title('矩形波均方根谱'); grid;%求功率根谱power=sq.^2;figure(2);subplot(234);plot(f,power);xlabel('频率(HZ)');ylabel('功率谱');title('矩形波功率谱'); grid;%求对数谱ln=log(sq);figure(2);subplot(235);plot(f,ln);xlabel('频率(HZ)');ylabel('对数谱');title('矩形波对数谱'); grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs; figure(2);plot(ti,magx);xlabel('t');ylabel('y');title('通过IFFT转换的矩形波波形');grid;3.白噪声fs=10;%设定采样频率t=-5:0.1:5;x=zeros(1,100);x(50)=100000;figure(3);subplot(231);plot(t(1:100),x);%作白噪声的时域波形xlabel('t');ylabel('y');title('白噪声时域波形');grid;%进行FFT变换并做频谱图y=fft(x);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对象的频率转换figure(3);subplot(232);plot(f,mag);%做频谱图xlabel('频率(HZ)');ylabel('幅值');title('白噪声幅频谱图');grid;%求均方根谱sq=abs(y);figure(3);subplot(233);plot(f,sq);xlabel('频率(HZ)');ylabel('均方根谱');title('白噪声均方根谱');grid;%求功率谱power=sq.^2;figure(3);plot(f,power);xlabel('频率(HZ)');ylabel('功率谱');title('白噪声功率谱');grid;%求对数谱ln=log(sq);figure(3);subplot(235);plot(f,ln);xlabel('频率(HZ)');ylabel('对数谱');title('白噪声对数谱');grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs;figure(3);subplot(236);plot(ti,magx);xlabel('t');ylabel('y');title('通过IFFT转换的白噪声波形'); grid;4.巴特沃斯高通数字滤波器Fs=5000;wp=2000*2/Fs;ws=1500*2/Fs;Rp=1;Rs=20;Nn=128;[N,Wn]=buttord(wp,ws,Rp,Rs);[b,a]=butter(N,Wn,'high');freqz(b,a,Nn,Fs)(二).程序执行后得到的图像①正弦波②矩形波③白噪声④巴特沃斯高通滤波器四.结论1. FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。

FFT算法分析实验实验报告

FFT算法分析实验实验报告

FFT算法分析实验实验报告一、实验目的快速傅里叶变换(Fast Fourier Transform,FFT)是数字信号处理中一种非常重要的算法。

本次实验的目的在于深入理解 FFT 算法的基本原理、性能特点,并通过实际编程实现和实验数据分析,掌握 FFT 算法在频谱分析中的应用。

二、实验原理FFT 算法是离散傅里叶变换(Discrete Fourier Transform,DFT)的快速计算方法。

DFT 的定义为:对于长度为 N 的序列 x(n),其 DFT 为X(k) =∑n=0 到 N-1 x(n) e^(j 2π k n / N) ,其中 j 为虚数单位。

FFT 算法基于分治法的思想,将 N 点 DFT 分解为多个较小规模的DFT,从而大大减少了计算量。

常见的 FFT 算法有基 2 算法、基 4 算法等。

三、实验环境本次实验使用的编程语言为 Python,主要依赖 numpy 库来实现 FFT 计算和相关的数据处理。

四、实验步骤1、生成测试信号首先,生成一个包含不同频率成分的正弦波叠加信号,例如100Hz、200Hz 和 300Hz 的正弦波。

设定采样频率为 1000Hz,采样时间为 1 秒,以获取足够的采样点进行分析。

2、进行 FFT 计算使用 numpy 库中的 fft 函数对生成的测试信号进行 FFT 变换。

3、频谱分析计算 FFT 结果的幅度谱和相位谱。

通过幅度谱确定信号中各个频率成分的强度。

4、误差分析与理论上的频率成分进行对比,计算误差。

五、实验结果与分析1、幅度谱分析观察到在 100Hz、200Hz 和 300Hz 附近出现明显的峰值,对应于生成信号中的频率成分。

峰值的大小反映了相应频率成分的强度。

2、相位谱分析相位谱显示了各个频率成分的相位信息。

3、误差分析计算得到的频率与理论值相比,存在一定的误差,但在可接受范围内。

误差主要来源于采样过程中的量化误差以及 FFT 算法本身的近似处理。

fft谱分析实验报告

fft谱分析实验报告

fft谱分析实验报告实验名称:FFT谱分析实验报告实验目的:1. 学习和掌握FFT(快速傅里叶变换)算法的原理和相关知识。

2. 掌握使用FFT算法进行信号频谱分析的方法和步骤。

3. 通过实验探究不同信号的频谱特征。

实验器材:1. 个人电脑或计算机设备。

2. 谱分析软件(如MATLAB、Python中的numpy.fft模块等)。

实验步骤:1. 准备待分析的信号。

可以是一个模拟信号(如音频或振动信号),也可以是一个数字信号(如从传感器获取的数据)。

2. 打开谱分析软件,并将信号导入到软件中。

3. 使用FFT算法对信号进行频谱分析。

根据软件的具体操作方法,选择合适的参数和设置,如采样率、频率范围等。

4. 确认参数设置无误后,运行软件执行FFT算法,获得信号的频谱图。

5. 分析并解读频谱图。

观察频谱图中的峰值、幅值等信息,进一步了解信号的频谱特征。

实验结果:1. 频谱图:根据实际数据和运行软件获得的结果,绘制信号的频谱图。

2. 频谱特征分析:根据观察和分析频谱图,记录和分析信号的频谱特征(如频率分布、幅值变化等)。

实验讨论和结论:1. 对不同信号的频谱图进行比较和分析,探究信号的不同频谱特征。

2. 讨论和分析不同参数设置对频谱图的影响,如采样率、频率范围等。

3. 总结实验中遇到的问题和解决方案,提出改进和优化的建议。

实验总结:通过本次实验,我们学习和掌握了FFT谱分析的原理和方法。

通过对不同信号的频谱分析,我们了解了信号的频谱特征,并探讨了不同参数设置对频谱图的影响。

实验过程中,遇到了一些问题,并通过分析和解决,不断提高了实验的准确性和可靠性。

通过本次实验,我们对FFT谱分析有了更深入的理解,为以后的信号处理和频谱分析工作奠定了基础。

FFT频谱分析范文

FFT频谱分析范文

FFT频谱分析范文快速傅里叶变换(Fast Fourier Transform,FFT)是一种广泛应用于频谱分析的算法,它可以将时域信号转换为频域信号。

通过FFT,我们可以获得信号的频谱信息,包括频率分量、振幅和相位等。

本文将从基本原理、算法流程、应用场景以及优缺点等方面对FFT频谱分析进行详细介绍。

一、基本原理FFT的基本原理是基于傅里叶级数展开定理,将周期信号表示为频率分量的叠加。

在信号处理中,我们常常将非周期信号看作是周期信号的一部分,然后通过FFT将其展开为频谱。

FFT将连续信号转换为离散信号,进而进行计算,通过求解离散傅里叶变换(DFT)来分析信号的频谱。

二、算法流程1.输入:要进行FFT分析的原始信号,包括采样点数N和采样频率Fs。

2.预处理:对输入信号进行窗函数处理,常用的窗函数有汉宁窗和海明窗等。

3.快速傅里叶变换:将预处理后的信号进行FFT计算,得到频率域的幅度和相位信息。

4.频谱分析:根据FFT的结果,可以获得信号的频率分量以及其对应的振幅和相位信息。

5.结果展示:可以将频谱信息绘制成图形,以便更直观地观察信号的频谱特征。

三、应用场景1.语音信号处理:通过FFT分析,可以提取语音信号的频谱特征,应用于语音识别和语音合成等领域。

2.图像处理:可以将图像进行FFT变换,获得图像频谱,进而进行滤波、增强等操作。

3.音乐分析:可以通过FFT分析音乐信号,提取音乐的频谱特征,用于音乐信息检索和音乐情绪分析等任务。

4.振动分析:可以通过FFT分析机械设备的振动信号,从而判断其工作状态和故障情况。

5.通信系统:在调制解调和信号传输中,FFT广泛应用于频域均衡、多载波调制等。

四、优缺点1.优点:(1)快速计算:FFT算法是一种高效的计算方法,相较于传统的傅里叶变换算法具有更快的计算速度。

(2)精度高:FFT算法具有较高的精度,在处理信号时可以达到较小的误差。

(3)应用广泛:FFT可以用于各种信号处理领域,适用于多种类型的信号分析。

FFT频谱分析范文

FFT频谱分析范文

FFT频谱分析范文FFT(快速傅里叶变换)频谱分析是一种用于对信号进行频域分析的方法。

它通过将信号从时域转换到频域,可以揭示出信号的频率成分以及它们的相对强度。

FFT是一种高效的算法,能够快速地计算出信号的频谱。

在计算机中,FFT可以在较短的时间内处理大量的数据,并且具有较高的计算精度。

因此,FFT频谱分析在信号处理、通信、声音分析等领域得到了广泛应用。

首先,FFT频谱分析需要将信号转换为数字形式。

这可以通过模数转换(ADC)来实现。

ADC将连续的模拟信号转换为离散的数字信号,这样信号就可以在计算机中进行处理。

接下来,需要对信号进行窗函数处理。

窗函数是一种用于减小频谱泄漏(spectral leakage)的方法。

频谱泄漏是指当信号的频率不是正好处于FFT的一个频点上时,信号的能量会泄漏到其他频率上。

采用窗函数可以有效地减小频谱泄漏,并提高FFT的精度。

然后,我们可以对信号进行FFT变换。

FFT将信号从时域转换为频域。

在频域中,信号被分解为一系列不同频率的正弦和余弦波的叠加。

FFT的结果称为功率谱密度(Power Spectral Density,PSD)。

PSD表示了信号在不同频率下的能量分布情况。

最后,我们可以通过绘制PSD图来可视化信号的频谱。

PSD图通常使用对数坐标来表示,横轴表示频率,纵轴表示功率。

通过PSD图,我们可以直观地观察到信号的主要频率成分以及它们的相对强度。

FFT频谱分析在很多领域都有广泛的应用。

在音频处理中,FFT可以用于音频信号的频谱分析、音频合成、音频压缩等方面。

在通信领域,FFT可以用于频谱分析、信道估计、信号调制等方面。

在生物医学领域,FFT可以用于脑电图(EEG)信号的频谱分析、心电图(ECG)信号的频谱分析等方面。

总之,FFT频谱分析是一种强大的工具,可以帮助我们理解信号的频率成分和特征。

通过FFT频谱分析,我们可以揭示出信号中存在的各种频率分量,进而有助于我们做进一步的信号处理和分析。

fft实验分析实验报告

fft实验分析实验报告

fft实验分析实验报告FFT实验分析实验报告一、引言傅里叶变换(Fourier Transform)是一种重要的信号分析工具,它能够将一个信号分解成不同频率的成分。

快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效的计算傅里叶变换的算法。

本实验旨在通过实际操作,探究FFT在信号分析中的应用。

二、实验设备与方法1. 实验设备:本实验使用的设备包括示波器、信号发生器和计算机。

2. 实验方法:(1)将信号发生器的输出接入示波器的输入端。

(2)调节信号发生器的参数,如频率、振幅等,产生不同的信号。

(3)通过示波器观察信号的波形,并记录相关数据。

(4)将示波器与计算机通过USB接口连接,将示波器上的数据传输到计算机上。

(5)使用计算机上的软件进行FFT分析,得到信号的频谱信息。

三、实验结果与分析1. 实验一:正弦波信号的FFT分析(1)设置信号发生器的频率为1000Hz,振幅为5V,产生一段正弦波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,正弦波信号的频谱图呈现出单个峰值,且峰值位于1000Hz处。

这说明FFT能够准确地分析出信号的频率成分,并将其可视化展示。

2. 实验二:方波信号的FFT分析(1)设置信号发生器的频率为500Hz,振幅为5V,产生一段方波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,方波信号的频谱图呈现出多个峰值,且峰值位于500Hz的倍数处。

这说明方波信号由多个频率成分叠加而成,FFT能够将其分解出来,并显示出各个频率成分的强度。

3. 实验三:复杂信号的FFT分析(1)设置信号发生器的频率为100Hz和200Hz,振幅分别为3V和5V,产生一段复杂信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DSP2812上FFT调试心得1 事前准备工作FFT运算的代码实现(基本上是所有的程序中)最核心的两个问题就是:数据结构和算法。

由于FFT运算的结果是复数形式,该怎么存储,存储为什么数据格式都要考虑清楚,后面会交代。

FFT的核心程序不建议自己编写,如果你足够厉害的话也可以自己写,主要原因有两个,一计算的精度问题(涉及到数据结构),二是程序的执行效率问题,这些在hello dsp论坛都有讲到。

所以在项目开始之前先从TI官网下载FFT函数库(文件名sprc081),解压并安装。

其次下载一个C28xx定点库说明书(C28X_Fixed_Point_Library_v1_01)拜读一下,上面有FFT库函数的讲解,不要惧怕读英文。

本阶段所需要的文件如下图。

话不多说,现在开始上马,从新建工程开始。

2 新建工程跟往常一样,添加各种文件。

另外为完成FFT运算,需要额外添加以下文件:fft.h,fft.lib和完成FFT运算的asm文件,参见下图高亮显示的头文件和库文件 源文件 由于我用的是复数CFFT 运算,所以源文件里面是cfft32xxx ,如果你用的是实数RFFT32运算,则相应的添加rfft32xxx 。

所有的汇编文件见下图下面就可以编写自己的源文件了。

先说明下我的源文件是干什么的。

我没有用TI 给的例子,里面的位码倒置函数使用了2次,感觉不太对吧,而且加窗函数其实可有可无。

我的是对普通电网的220V电压信号进行采集并进行谐波分析。

具体方法是将正负220V调理到0到3V的交流信号提供给2812的ADC采集,并进行FFT运算。

一个周期(0.02s,50Hz)采集1024个点,由于点数较多,涉及到后面的数据段的分配(CMD文件的配置)等后面再说。

不用我说,这些头文件都要写在程序里吧。

中间的unsigned int flag=0到float harmonics[100]是我自己定义的变量就不需要了。

用#pragma定义了段以后就必须到CMD里面为它分配存储空间。

CMD配置具体参见教科书。

说一下我在这阶段的问题吧。

首先ipcb[2N]得占4K个字(4K*16),mag[N]占2K*16,还有一个潜在的数据段FFTtf(存放旋转因子的,貌似占3N/4个字)最好也得分个2K*16,一共得8K,很明显DSP2812的RAM是存不下的,可能有人会说,2812的RAM不是有18K吗,还存不下?因为2812的RAM都分成不同大小的区了,如果没记错的话H0占8K,不过这些分给程序去了,唯一大点的空间就是L0 SARAM和L1 SARAM各4K,理论上刚刚好。

最开始我把FFTipcb、FFTmag和FFTtf分到这两个区存储,调试出问题了计算结果一直是0,后面仔细翻书发现这两个区是受CSM保护,需要密码才能通过JTAG口读取。

在线调试看不到数据。

段定义到flash中也是一样的受CSM保护,且会降低速度。

初学者还是分配到RAM中便于观察,调试方便。

我的解决办法是在外设接口2区扩展了一个256K*16的RAM,然后将FFTipcb、FFTmag和FFTtf分配到该外扩RAM中去(我用的是试验箱,别人已扩展好)。

RAM扩展电路如下图。

如果你采样数据没这么多,内部RAM完全够用的话,那你就当我上面说的是一堆废话吧。

下面附上我的CMD配置文件和外扩RAM的初始化程序。

CMD在MEMORY PAGE1 下添加:在SECTION中添加:外扩RAM的初始化在DSP28_Xintf()中,其中zone1没必要初始化,看你用的是哪个区就初始化哪个区:上述寄存器配置请看文档。

接下来调试的过程中又出现问题了。

在观察ipcb数组里面的值时提示Memory map prevent read of target memory at address 0x080000.这个问题花了我两天的时间去解决,一直以为是外部RAM没扩展好,或是找程序的原因。

后面发现CCS里面的option->memory map 中的地址映射在0x080000出没有映射成RAM或ROM,而是NONE。

取消Enable memory mapping前面的钩即可观察相应地址的数据。

不好意思,废话太多,请见谅!!!3 调用FFT库函(1)初始化FFT(2)给输入数组ipcb赋值因为ipcb是复数形式,偶数位存实部,奇数位存虚部。

如下图所示,当然也可以通过acq定义的结构体输入,那玩意没研究过就不讲了吧。

这里有话要讲,不然后面就要出错,导致mag里面全零。

请看我注释中有一行voltage_dots[j]=(voltage_dots[j]*2.85/65520.0-1.5)*120110.0/470.0/400.0;最后面的除以400先不要,变成voltage_dots[j]=(voltage_dots[j]*2.85/65520.0-1.5)*120110.0/470.0表示将采样值还原成220√2sin⁡(wt)的形式,即还原后的采样点大小在-311到+311之间。

由于定点FFT运算的输入ipcb是Q31格式(我也不懂没下到详细资料),大致意思是输入给ipcb的数据先转换成-1到1之间,然后再左移31位(<<2^31),所以有ipcb[2*j]=(long)(voltage_dots[j]*2147483648);这条赋值语句(2^31=2147483648)。

输出mag中的值及其与原始信号220√2sin⁡(wt)之间的关系见第4章讲解。

(3)位码倒置和计算4 输入和输出数据的对应关系先废话一下运算结果存放问题:ipcb[]即存放输入数据,又存放运算好的结果,复数形式,即实部、虚部、实部、虚部无限循环下去。

Mag[]中存放的是谐波幅值的平方(别问我为什么存的是平方而不是实际值,开方多耗时间啊)。

(1)频谱幅值问题来了问题1:如果你输入给ipcb的值不是按照先转换成-1到1,再左移31位的话,而是按照论坛上别人说的因为28x系列DSP是定点处理器,而FFT计算涉及到不少浮点计算,TI使用Q 格式来解决这个问题(Q格式说明可参考sprc087_IQmath)。

事实上输入数据采用Q31格式能在避免计算溢出前提下获得最好的计算精度。

对AD采样的数据进行FFT计算,定义计算缓冲区数组:long ipcb[N+2];因为AD结果寄存器是12位的,在数据左对齐的情况下直接左移15位即可:ipcb[ConversionCount] = ((unsigned long)AdcRegs.ADCRESULT0)<<15;那么恭喜你mag中能得到一堆数据,但是mag中的幅值如何对应到原始信号的赋值,不好意思,本教程解答不了(应为作者水平有限,没有琢磨透)如果你是按我说的先除以一个比例系数变成-1到+1,再左移31位的话,那么对应关系将非常明显,我是参考的以下内容,贴出来大家看看(/blogger/post_read.asp?BlogID=991984&PostID=21775125)。

群里有不少同学在讨论如何从FFT库调用后的mag数组中计算所要的结果,其实我看问题的关键都集中在如何看待输入输出数据的Q格式问题。

好些同学认为既然输出是Q30格式,那就将结果直接除2^30,即将mag数组除以1073741824再开方,比如好些同学就直接用与下面类似的代码:for(i=0;i<512;i++){mag[i]= sqrt(mag[i]/1073741824.0);}但是大家都看到,求得的结果mag值几乎都为0。

事实情况是不是这样的呢,或者是不是这样求的,我们可以来试验一下。

因AD采样进的数据受AD参考电压、采样频率精度等影响,为了不让这些误差影响到试验过程和结果,这里采用从MATLAB中仿真计算出一组更理想的且精度更高的采样数值,将其当作外部AD采样的数据,再导入到CCS中让DSP进行FFT计算。

用MATLAB 计算模拟采样点:%%%%%%%%%%%%%%根据实际情况修改下列参数f1 =5; %频率f1a1 = 1; %幅值a1f_sample = 1024; %采样频率N = 2048; %采样点N%采样n = 0:N-1;t = n/f_sample;y= a1*sin(2*pi*f1*t);y_int32=int32(y*2^31); %移位成Q31格式将这组数据导入到CCS中,从CCS图里打开ipcb观察是否导入成功或导入正确。

然后运行与FFT相关的代码,观察mag数组元素值和图形。

从上图可看出计算结果非常漂亮,就是一根完美的脉冲尖峰线,这正好有利于下面的分析(这就是为什么这里不用带有各种干扰误差且影响分析的AD数据而用MATLAB模拟采样数据的原因)。

对结果进行分析。

频率值很好算,mag数组只有mag[10]= 268435451而其余皆为0,故该单频信号的频率值为10* f_sample/ N=5Hz=f1,幅值怎么算?是否直接除2^30?,看看结果:>> 268435451/2^30ans =0.2500说明结果并不是为1,因此求幅值并不能简单地直接除以1073741824再开方,观察这里还有个规律,若是:>> 2*sqrt(268435451/2^30)ans =1.0000开方后还有个两倍的关系,这时才能是真实的幅度值。

我没有仔细研究FFT库里面的汇编程序代码,系数2可能还是Q格式中的移位问题所致。

最近因各种事繁忙,我还没仔细往里面找原因。

现在试验是否可以这样求幅值。

若输入信号的真实幅值(随便写个数)为0.556458,频率还是5Hz,还是按照上面的方法来计算,FFT后的mag[10]= 83119830,则>> 2*sqrt(83119830/2^30)ans =0.55645799150412与真实幅值0.556458对比,上述结果是非常精确的。

其实还可以观察出一些关于FFT输入输出Q格式数据的一些规律。

比如上面的计算,因为移位,输入数据(-1~1之间)放大了2^31倍,计算幅值其实是sqrt(83119830/2^28),若是不放大这么多倍,那如何计算?再随便写个信号幅值数,假定为0.781234,此时移位放大不是2^31而是其他(当然不能移位超出31不然就溢出了,表现在信号上就是信号的上下限被削顶了),假设放大了2^29,将此作为FFT输入,得到mag值>> 2*sqrt(10239579/2^26)ans =0.78123393995944我想仔细的同学也能猜得出来规律了。

其实TI 的这个库输入用Q31格式,是为了得到定点处理器运算下FFT最好的精度,我花了一些时间做计算,做了一个表,从中可以看出这一点。

相关文档
最新文档