随笔记录——一种跟fft算法相关的校验算法

本文详细介绍了一种用于快速傅里叶变换(FFT)模块的校验算法,该算法通过对输入数据进行分段并求和来验证FFT的正确性。文中提出了一种改进的求和方法,确保最终校验结果不为零,适用于FPGA等硬件环境。

fft——快速傅里叶变换算法

这个算法是流传非常广的一个算法,我在RRU文章里已经很详细的介绍过他的原理了,这里就是详细叙述。直接切入!

说一说为什么要进行校验:其实并不是说所有用fft的都会要用到对fft数据的校验,但是在fpga或者其他的环境下,当你最初的input信号经过一层层的传递,来到fft这个模块的时候,fft的输入信号已经不是你当初给的数据那样了,而且你输入的数据也已经是没有相应的详细信息了,当数据量达到一定的程度,如果说改动了原有的运行环境之后出现了错误的话,你可能会需要非常多的时间去debug。当然,也不是说一定要在fft这个模块的位置设置一个校验,其他地方也可以,我这里就单纯的说说怎么对fft这里做一个校验。

校验:fft在fpga中已经是常客了,经常会需要用到它,因此amd(Xilinx)公司已经有非常成熟可以直接使用的fft IP核了,我们只需要设置参数即可。fft的输入数据那么多,我们怎么进行一种简单直观的检验方法来设置这个校验点呢?
我这里是采取的通过每一个单位周期,这一个周期可以是一个帧,也可以是一个编码单位,也可以以某个特定的符号位来进行切割。这些不重要,只要是能将所有数据独立的平等的分段即可。然后需要取到我们分段的这个依据,可以称为tick或者boundary,我们将用这个信号来进行分段的触发,并各将每段作为一个整体求和。
fft中的信号是符合正弦波的,因此简单的按周期求和将会永远得到那个答案——0。所以我们需要在A+B+C+……+Z的求和算法上,做一点点小改动。

我们声明两个信号checksum_pre and check_sum,位宽根据你的数据预留,check_sum为你的求和结果,checksum_pre用来对你的求和结果做一个处理,同时还需要有一个对数据进行计数的计数信号,然后我们这样进行求和:
check_sum = checksum_pre ^ cnt ^ data
求和的方法知道了之后,再回到求和结果的处理方法,我们每一次求和完成之后,对这个求和结果进行一个高低位转换。这样就能确保最后的出的结果不会为0。
下面贴出我所使用的的实际算法:
在这里插入图片描述
我的数据位宽为16bits,根据数据数量,给checksum设置了32bits的位宽。
时间原因,如果需要,我后面可以再更新细说这个算法的思路。

离散频谱的比值校正法-频谱分析的校正方法.pdf 离散频谱的比值校正法 在下帖子中讨论了“Matlab中FFT求正玹序列的振幅”https://www.ilovematlab.cn/thread-50611-1-1.html 我在帖子中指出了当“正弦信号的频率不与FFT后的某条谱线相合”,可用校正法来求正弦信号的频率。在这里提供一个比值校正法的程序,它已编写成一个函数,该方法的理论可参看以下附件。 function Z=Specorr [nx,mx]=size; if mx==1, x=x';end [nx,mx]=size; if mx<N     x=[x zeros]; else     x=x; end w=hann; if method==2     xf=fft;     xf=xf/N*4;     WindowType=2; else     xf=fft;     xf=xf/N*2;     WindowType=1; end ddf=fs/N; n1=fix; n2=round;     A=abs;     [Amax,index]=max);     index=index n1-1;     phmax=angle);     %比值法     %加矩形窗     if         indsecL=A>A;         df=indsecL.*A./)-.*A./);         Z=*ddf;         Z=Amax/sinc;         Z=;              end         %比值法     %加Hanning窗     if         indsecL=A>A;         df=indsecL.*-Amax)./)-.*-Amax)./);         Z=*ddf;         Z=*Amax/sinc;         Z=;              end     Z=mod,2*pi);     Z=Z->pi)*pi; 调用格式是 Z=Specorr 其中输入变量 x     是被测信号   fs    采样频率 N    FFT的长度(相当于nfft) nx1,nx2   被测正弦信号频率的区间,nx2>nx1 method   窗函数的方法,1为矩形窗,2为海宁窗 输出变量Z,Z为被测信号的频率,Z为被测信号的幅值,Z为被测信号的初始相角 这里把https://www.ilovematlab.cn/thread-50611-1-1.html 帖子中1层的程序修改一下列于 Fs=1000; n=0:1/Fs:1; xn=10 15*sin randn); nfft=1024; Xn = fftshift); Xn=Xn/2; A=2*abs/Fs; subplot,plot subplot stem xlabel,ylabel P=Xn.*conj/nfft; xlim Z=Specorr 这样得到Z为 Z =    10.0003   15.0009    1.5693 信号频率为10.0003,幅值为15.0009,初始相角为1.5693。初始相角是以余弦信号为准,正弦信号正好差pi/2。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值