double
B[1100]={0};
改成
void
FFT(double
data[],
int
nn,
isign)
具体程序如下:
#include
iostream.h
"math.h"
#includestdio.h
#includestring.h
stdlib.h
fstream.h
afx.h
{
//复数的快速傅里叶变换
n,j,i,m,mmax,istep;
tempr,tempi,theta,wpr,wpi,wr,wi,wtemp;
n
=
*
nn;
j
for
(i
i=n
;
//这个循环进行的是码位倒置.
if(
i)
tempr
data[j];
tempi
data[j
+
①.];
data[j]
data[i];
data[i
data[i]
tempr;
tempi;
}
m
/
while
(m
m)
-
m;
mmax
while(
)
istep
mmax;
theta
(isign
mmax);
wpr
theta);
wpi
sin(theta);
wr
①0;
wi
0.0;
for(
m=mmax;
i=n;
i=i+istep)
i
tempr=double(wr)*data[j]-double(wi)*data[j+1];//这两句表示蝶形因子的下一个数乘以W因子所得的实部和虚部.
tempi=double(wr)*data[j+1]+double(wi)*data[j];
//蝶形单元计算后下面单元的实部,下面为虚部,注意其变换之后的数组序号与书上蝶形单元是一致的
wtemp
wr;
wi;
istep;
main()
//本程序已经和MATLAB运算结果对比,准确无误,需要注意的的是,计算中数组都是从1开始取得,丢弃了A[0]等数据
char
ij;
CString
ij=1;
其中的数据格式见该文件
FILE
*fp
if(!fp)
cout"Open
file
is
failing!"endl;
return;
while(!feof(fp))
//feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0.
//清空为0
//函数的功能是从fp所指文件中读入n-1个字符放入line为起始地址的空间内
sscanf(line,
"%s%s",
dataA,
dataB);
//dataA读入第一列,dataB读入第二列
B[ij]=atof(dataA);
//将字符型的dataA值转化为float型
ij++;
(int
//*******************************************正式计算FFT
//********************************************写入数据到workout.txt文件中
*pFile=fopen("workout.txt","a+");
//?a+只能在文件最后补充,光标在结尾.没有则创建
if
(A[k+1]=0)
else
strl1=strlen(str1);
//
用
法:fwrite(buffer,size,count,fp);
buffer:是一个指针,对fwrite来说,是要输出数据的地址.
size:要写入的字节数;
count:要进行写入size字节的数据项的个数;
fp:目标文件指针.
fwrite(str1,1,strl1,pFile);
fclose(pFile);
cout"计算完毕,到fft_test\workout.txt查看结果"endl;
土嘎嘎的粉丝们大家好,这是我的回答,希望可以帮到你.
①.)结果讨论
一,如果对信号进行同样点数N的FFT变换,采样频率fs越高,则可以分析越高频的信号;与此同时,采样频率越低,对于低频信号的频谱分辨率则越好.
二,假设采样点不在正弦信号的波峰、波谷、以及0电压处,频谱则会产生泄露(leakage).
三,对于同样的采样率fs,提高FFT的点数N,则可提高频谱的分辨率.
五,对于(二)中泄露现象,可以通过在信号后面补零点解决.
%清除命令窗口及变量
clc;
clear all;
%输入f、N、T、是否补零(补几个零)
f=input('Input frequency of the signal: f\n');
N=input('Input number of pointsl: N\n');
T=input('Input sampling time: T\n');
flag=input('Add zero too sampling signal or not? yes=1 no=0\n');
if(flag)
ZeroNum=input('Input nmber of zeros\n');
ZeroNum=0;
end
%生成信号,signal是原信号.signal为采样信号.
fs=1/T;
t=0:0.00001:T*(N+ZeroNum-1);
if (flag)
%画出原信号及采样信号.
figure;
plot(t,signal);
xlabel('Time(s)');
ylabel('Amplitude(volt)');
title('Singnal');
hold on;
axis([0 T*(N+ZeroNum) -1 1]);
%作FFT变换,计算其幅值,归一化处理,并画出频谱.
Pyy = Y.* conj(Y) ;
xlabel('Frequency(Hz)');
ylabel('Amplitude');
title('Frequency compnents of signal');
grid on;
good luck!
我可以帮助你,你先设置我最佳答案后,我百度Hii教你.
void fft(int nn) /* nn数据长度 */
switch(nn)
j=1;
for(i=1;i=nn;i++)
if(lj)
k=n1;
while (kj)
j=j-k;
j=j+k;
for(i=1;i=s;i++)
u1=1;
m=(1i);
k=m1;
w1=fcos[i-1];
for(j=1;j=k;j++)
for(l=j;lnn;l=l+m)
l1=l+k;
u1=z;
int DFT(int dir,int m,double *x1,double *y1)
long i,k;
double arg;
double cosarg,sinarg;
for(i=0;im;i++)
for(k=0;km;k++)
cosarg=cos(k*arg);
sinarg=sin(k*arg);
/*Copythedataback*/
if(dir==1)
return(TRUE);
#include math.h
class complex //定义一个类,实现复数的所有操作
double Real,Image; //实部与虚部
public:
complex(double r="0",double i="0"){Real=r;Image=i;}
double GetR(){return Real;} //取出实部
double GetI(){return Image;} //取出虚部
complex operator + (complex ); //复数加法
complex operator - (complex ); //复数减法
complex operator * (complex ); //复数乘法
void operator =(complex ); //复数 赋值
};
complex complex::operator + (complex c) //复数加法
complex t;
t.Real=Real+c.Real;
t.Image=Image+c.Image;
return t;
complex complex::operator - (complex c) //复数减法
t.Real=Real-c.Real;
t.Image=Image-c.Image;
complex complex::operator * (complex c) //复数乘法
t.Real=Real*c.Real-Image*c.Image;
t.Image=Real*c.Image+Image*c.Real;
void complex::operator = (complex c) //复数 赋值
Real=c.Real;
Image=c.Image;
void fft(complex a[],int length,int jishu) //实现fft的函数
complex u,Wn,t;
int i,j,k,m,kind,distance,other;
double tmp;
for(i=0;ilength;i++) //实现倒叙排列
k="i";
j=0;
for(m=0;mjishu;m++)
if(ij)
t="a";
a=a[j];
a[j]=t;
for(m=1;m=jishu;m++) //第m级蝶形运算,总级数为jishu
u=complex(1,0); //旋转因子初始值为 1
tmp=PI/kind;
Wn=complex(cos(tmp),-sin(tmp));//旋转因子Wn
for(j=0;jkind;j++) //每种蝶形运算的起始点为j,共有kind种
for(i=j;ilength;i+=distance) //同种蝶形运算
t=a[other]*u; // 蝶形运算的乘积项
a[other]=a-t; //蝶形运算
a=a+t; //蝶形运算
u="u"*Wn; //修改旋转因子,多乘一个基本DFT因子WN
void main(void)
double a,b;
x=complex(i,i+1);
printf("x(%d) = %lf + %lf i\n",i+1,x.GetR(),x.GetI());
printf("fft变换的结果为:\n");
printf("X(%d)= %lf + %lf i\n",i+1,x.GetR(),x.GetI());
快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的.它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步.
傅里叶变换(Transformée de Fourier)是一种积分变换.因其基本思想首先由法国学者傅里叶系统地提出,所以以其名字来命名以示纪念.
应用
傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用(例如在信号处理中,傅里叶变换的典型用途是将信号分解成幅值分量和频率分量).
概要介绍
傅里叶变换属于谐波分析.
傅里叶变换的逆变换容易求出,而且形式与正变换非常类似;
正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;
卷积定理指出:傅里叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;
离散形式的傅里叶变换可以利用数字计算机快速的算出(其算法称为快速傅里叶变换算法(FFT)).
以上就是土嘎嘎小编为大家整理的c语言傅立叶处理函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!