做8点的FFT程序 用C或matlab实现

做8点的FFT程序 用C或matlab实现,第1张

n年前做的了基2的

#include "stdafxh"

#include "complexh"

void main()

{

const double pi = 314159265;

int i; //循环变量

//////////////////////////////////////////////////////////////////

//信号生成:正弦信号,固定频率。生成1024点

const N = 64; //信号点数

const n =N/2; //半点数,用于循环控制

float S[N]; //信号数组

float temp;

temp = (float) (8 pi) / N; //出现两个周期

for(i=0; i<N; i++) S[i] = (float) sin(temp i);

//////////////////////////////////////////////////////////////////

//旋转因子数组生成

complex W[n];

temp = (float) (2 pi / N);

for(i=0; i<n; i++) {

W[i]SetReal((float)cos(temp i));

W[i]SetImag((float)-sin(temp i));

// cout<<W[i]<<endl;

}

///////////////////////////////////////////////////////////////////

//变换:基2-FFT

//先做蝶形运算,再对信号排序

///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////

//读入排序的信号

complex x;

x = new complex[Nsizeof(complex)];//计算用数组

///////////////////////////////////////////////////////////////////

//读入信号

for(i=0; i<N; i++) x[i]SetReal(S[i]);

///////////////////////////////////////////////////////////////////

//蝶形运算

int j, k; //循环变量

complex t;

for(i=n, k=1; i>=1; i>>=1, k<<=1) {

k %= n; //旋转因子调整

for(j=0; j<N;) {

t = x[j+i]; //蝶形运算

x[j+i] = x[j] - t;

x[j] = x[j] + t;

x[j+i] = x[j+i] W[(j%i)k];

j++;

if((j%i) == 0) j += i; //交叉

}

}

/////////////////////////////////////////////////////////////////////

//生成(以8点为例)形如0,4,2,6,1,5,3,7的排序数组

int y;

y = new int[Nsizeof(int)]; //调整计算用数组的排序用数组

for(i=0; i<N; i++) y[i] = 0;

for(i=1, k=n; i<=n; i<<=1, k>>=1)

for(j=0; j<2i; j++) y[i+j] = y[j] + k;

//////////////////////////////////////////////////////////////////////

//排序

complex X;

X = new complex[Nsizeof(complex)];

for(i=0; i<N; i++) X[y[i]] = x[i];

delete [] x; //销毁运算数组

delete [] y; //销毁排序数组

////////////////////////////////////////////////////////////////////////

//归一化

float a[N];

for(i=0; i<N; i++) a[i] = X[i]mod();

delete [] X;

temp = a[0];

for(i=1; i<N; i++) if(a[i]>temp) temp = a[i];

for(i=0; i<N; i++) a[i] =(float) a[i] / temp;

for(i=0; i<N; i+=4) cout<<a[i]<<" "<<a[i+1]<<" "<<a[i+2]<<" "<<a[i+3]<<endl;

}

你是不是用simulink将数据输出到workbench?再用matlab计算其SFDR,SNR等等参数?

最近也在做DAC的动态校准的东西,就把代码给你吧。我注释了一部分,你根据自己的需要自己改回来。

%load ScopeData;

dynamic_data=ScopeDatasignalsvalues;

data_size=size(dynamic_data);

N=max(data_size);

sample_number=input('输入采样点数:');

if sample_number>N

display('样本数据数量不够,请检查')

else data=dynamic_data(1:sample_number);

N=sample_number;

end

F_samples=input('输入采样频率:');

Mean_code=mean(data);

V=data-Mean_code;

V=Vhanning(N);

dout_spect=fft(V);

dout_dB=20log10(abs(dout_spect));

max_dB=max(dout_dB(1:N/2));

x=(0:N/2-1)F_samples/N;

y=dout_dB(1:N/2)-max_dB;

figure(1)

plot(x,y);

axis([0,F_samples/2,-120,0]);

grid off;

title('FFT图');

xlabel('模拟输入频率(Hz)');

ylabel('幅值(dB)');

F_in=find(dout_dB(1:N/2)==max_dB);

span=max(round(N/200),5);

spanh=2;

spectp=(abs(dout_spect))(abs(dout_spect));

Pdc=sum(spectp(1:span));

%Ps=sum(spectp(F_in-span:F_in+span));

F_harmonic=[];

P_harmonic=[];

for har_number=1:10

tone=rem((har_number(F_in-1)+1)/N,1);

if tone>05

tone=1-tone;

end

F_harmonic=[F_harmonic tone];

har_peak=max(spectp(round(toneN)-spanh:round(toneN)+spanh));

har_bin=find(spectp(round(toneN)-spanh:round(toneN)+spanh)==har_peak);

har_bin=har_bin+round(toneN)-spanh-1;

P_harmonic=[P_harmonic sum(spectp(har_bin-1:har_bin+1))];

end

disp(F_harmonic)

disp(P_harmonic)

%

% Pd=sum(P_harmonic(2:5));

%

% Pn=sum(spectp(1:N/2))-Pdc-Ps-Pd;

format;

% SNR=10log10(Ps/Pn)

%

% SINAD=10log10(Ps/(Pn+Pd))

SFDR=10log10(P_harmonic(1)/max(P_harmonic(2:5)))

% THD=10log10(Pd/P_harmonic(1))

%

% ENOB=(SINAD-176)/602

以上就是关于做8点的FFT程序 用C或matlab实现全部的内容,包括:做8点的FFT程序 用C或matlab实现、对12bit的AD建模后matlab写程序对其进行FFT,计算SNR并输出频谱图,程序该怎么写急、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10119204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存