学习的例程,使用蝶形运算进行fft。
发现改变NL(即N)从256变成512,fft结果变差,output[5]从0.99变成0.95
而且相位值利用fft输出Sample[N]数组计算 atan2(Sample[5].imag,Sample[5].real)和产生的输入数据不符合,这是为什么呢?fft计算方法有错误么?
附件是fft主函数,cmd文件就在N变成512时增大了DRAMH0 ,长度从0x001000变成0x002000
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
学习的例程,使用蝶形运算进行fft。
发现改变NL(即N)从256变成512,fft结果变差,output[5]从0.99变成0.95
而且相位值利用fft输出Sample[N]数组计算 atan2(Sample[5].imag,Sample[5].real)和产生的输入数据不符合,这是为什么呢?fft计算方法有错误么?
附件是fft主函数,cmd文件就在N变成512时增大了DRAMH0 ,长度从0x001000变成0x002000
您好,谢谢你的回复。输入信号采用的 Input[i]=sin(2*pi*5*i/(NL-1)+30*pi/180)+sin(2*pi*i*5*3/(NL-1)+60*pi/180)/3+sin(2*pi*i*5*5/(NL-1)+90*pi/180)/5;
N改变后,对应的基波应该还是在output[5]这个位置呀。而且output中最大值一直就是在5hz这个频率点,从0.99变成了0.95.
相位用虚部实部计算就不是输入信号。
我用matlab进行fft,对同样的信号进行变换,fft输出结果的虚实部满足输入信号的幅值和相位,是这种fft算法不对么? dsp实现fft的结果和matlab实现fft的结果不一样,虚部实部不同
Fn=(n-1)*Fs/N, 点变了应该会变的吧,你用的是TI 的库吗?可以把数据导出到matlab中运算一下,对比一下,运算应该会一致的
没用ti的库,用的研旭的例程,我试了N变成128,输出的output[5]也十分接近1,N=256就是例程自带的。N=512就变差了,这个Fs采样频率,我看程序中好像没有定义,针对的信号是相同的,N不同,采样点数值也会变化。我直接查看fft计算结果,发现输出复数的虚部实部和matlab计算的并不相同
TI库的fft函数实在看不懂cfft32xxx.asm的内容,同时也不明白fft.ipcbptr ,fft.magptr之类的代表什么,我没找到这个fft包含的东西,您那有TI库的使用例子么?
void MYFFT(struct Complex *xin,int N)//输入为复数指针*xin,做N点的FFT
{
int L=0;//级间运算层
int J=0;//级内运算层
int K=0,KB=0;//蝶形运算层
int M=1,Nn=0;//N=2^M
float B=0;//蝶形运算亮数据间隔
//建立倒序运算局部变量
int LH=0,J2=0,N1=0,K2=0,I;
struct Complex T;
//倒序运算
LH=N/2;
J2=LH;
N1=N-2;
for(I=1;I<=N1;I++) //N1有问题
{
if(I<J2)
{
T=xin[I];
xin[I]=xin[J2];
xin[J2]=T;
}
K2=LH;
while(J2>=K2)
{
J2-=K2;
K2=K2/2;
}
J2+=K2;
}
//计算M
Nn=N;
while(Nn!=2)
{
M++;
Nn=Nn/2;
}
//蝶形运算
for(L=1;L<=M;L++)
{
B=pow(2,(L-1));
Vn.real=1;
Vn.imag=0;
Wn.real=cos(pi/B);
Wn.imag=-sin(pi/B); //Wn=cos(pi/2^(L-1))-j*sin(pi/2^(L-1))
//Wn=e^(-j*2pi/2^L)
for(J=0;J<B;J++)//级内
{
for(K=J;K<N;K=K+2*B)//蝶形
{
KB=K+B;
T=MUL(xin[KB],Vn);
xin[KB].real=xin[K].real-T.real;//原址运算,将计算结果存放在原来数组中
xin[KB].imag=xin[K].imag-T.imag;
xin[K].real=xin[K].real+T.real;
xin[K].imag=xin[K].imag+T.imag;
}
Vn=MUL(Wn,Vn);
}
}
}
for(i=0;i<NL;i++) //产生一个三次谐波叠加而成的方波
{
//Input[i]=sin(2*pi*5*i/(NL-1));
Input[i]=sin(2*pi*5*i/(NL-1))+sin(2*pi*i*5*3/(NL-1)+pi*30/180)/3+sin(2*pi*i*5*5/(NL-1)+pi*90/180)/5;
//Input[i]=2+3*cos(2*pi*50*i/(NL-1)-pi*30/180)+1.5*cos(2*pi*75*i/(NL-1)+pi*90/180);
}
for(i=0;i<NL;i++) //输入实数信号转换为复数
{
Sample[i].real=Input[i];
Sample[i].imag=0;
}
MYFFT(Sample,NL); //FFT
ModelComplex(Sample,NL,output); //求模
PhaseComplex(Sample,NL,phase);
TI的dsp库,看官方文档就好了,controlsuite中:
controlSUITE\libs\dsp\FixedPointLib\v101\doc
N变化,由于使用的是 Input[i]=sin(2*pi*5*i/(NL-1)+30*pi/180)+sin(2*pi*i*5*3/(NL-1)+60*pi/180)/3+sin(2*pi*i*5*5/(NL-1)+90*pi/180)/5;这种作为输入采样数据,可见其采样频率也跟着变化了呀
Fn=(n-1)*Fs/N对应的频率点应该仍旧是n Hz吧,相当于是256采样点,采样频率256Hz;512采样点,采样频率512Hz
嗯,找到了C28x Fixed Point DSP Library v101.pdf这个文档,估计也只能看懂如何调用的,具体的汇编语言实现真是看不明白
之前没注意到你的这个信号源,这样的话,的确信号源频率有跟着变化,对应的点虽然频率不是原来的频率,但是却是原来的幅值。
理想情况是一致的,但由于fft的本身一些效应,结果会有一些差异。
FFT算法是一致的,用汇编实现是针对dsp的优化,完全可以不用管。