请教关于傅立叶变换的一个问题?

kathywp 2003-04-26 10:51:36
我在做一个快速傅立叶变换的程序,我只用实部,输入数组为1024的一个double类型数组.
但我不知道怎样才能知道正确的变化之后的数组应该是什么,我不会用matlab,想验证我的程序是否正确,应如何去做呢?

输入数组为
y = 100*sin(0.01*i) //i=0,1,2,3,4.....
针对上面的公式得出的y值被填入将要转换的数组,数组大小为1024
是不是转换以后的数组里面不会有超过100(振幅)的值?(请优先回答这个)
请大家帮我看看我的频率取的可以满足要求么?
谢谢各位!
...全文
103 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anikan 2003-09-21
  • 打赏
  • 举报
回复
楼主:
你想要干什么呢?你已经有了波形函数,干嘛还要做傅立叶变换呢?!,做傅立叶变换的目的是:原先非波形函数做完变换后,以便于做频幅分析。
TO alphapaopao(炮炮)
纠正一下你的说法,f(x) = a0 + sum(ak*cos(kx) + bk * sin(kx)); k = 1,2, ...
做三角函数展开时候ak,bk该积分要收敛且满足<无穷大,具体看高等数学吧。
yonk 2003-09-20
  • 打赏
  • 举报
回复
大学《计算方法》讲的有这个算法,具体什么不记得了,你可以找找看。
我知道它的原理就是傅氏变换,如果你微分学的不错,应该可以试试。
我原来也做一个类似问题,公司要求精度太高,结果想了许多办法也没能实现。
你的程序正确与否,可以通过逻辑分析来检查一下。
sweengirl 2003-09-20
  • 打赏
  • 举报
回复
我给了一个函数
y=220*sin(2*pi*50*t)
采了一周波的值进行fft分析
可是用fft分析后(采样点定的512),幅值算成了几万,和函数不相符,为什么
beckhamwu 2003-04-26
  • 打赏
  • 举报
回复
啊.................................................
阿门!!!!!!!!!!!!!!!!!!!!!!!!!!!!
kathywp 2003-04-26
  • 打赏
  • 举报
回复
好像没有,我查过了.谢谢你
用户 昵称 2003-04-26
  • 打赏
  • 举报
回复
http://www.pchome.net/dl/calc.htm

以前从这里见过很多计算器,不知道有没有算FFT的。
kathywp 2003-04-26
  • 打赏
  • 举报
回复
如果有人会用matlab,也请帮我试试,看结果是什么样子,谢谢!~
westfish_wu 2003-04-26
  • 打赏
  • 举报
回复
关注
kathywp 2003-04-26
  • 打赏
  • 举报
回复
上面的程序我也用了,填充数据时,我只填充了实部,不知道会不会有什么影响,虚部所有值我都填的0;
kathywp 2003-04-26
  • 打赏
  • 举报
回复
to 炮泡:
谢谢!,不过我想问的是我转换以后的数组里面的数据大概的大小应该为多少,我转换后的数组里面峰值达到了3万多,这是正值,还有负值达到了1万多,而且每次我改变输入频率,数组的峰值都不一样
用户 昵称 2003-04-26
  • 打赏
  • 举报
回复
不懂FFT,只能帖一个代码,做做比较

回复人: hailong0108(汤姆) ( ) 信誉:110 2003-01-17 17:58:00 得分:0


看看是不是它。
// FreTrans.h


#ifndef _INC_FreTransAPI
#define _INC_FreTransAPI

#include <complex >
using namespace std;

// 函数原型
VOID WINAPI FFT(complex <double > * TD, complex <double > * FD, int r);
VOID WINAPI IFFT(complex <double > * FD, complex <double > * TD, int r);

#endif //!_INC_FreTransAPI
/*************************************************************************
*
* 函数名称:
* FFT()
*
* 参数:
* complex <double > * TD - 指向时域数组的指针
* complex <double > * FD - 指向频域数组的指针
* r -2的幂数,即迭代次数
*
* 返回值:
* 无。
*
* 说明:
* 该函数用来实现快速付立叶变换。
*
************************************************************************/
VOID WINAPI FFT(complex <double > * TD, complex <double > * FD, int r)
{
// 付立叶变换点数
LONG count;

// 循环变量
int i,j,k;

// 中间变量
int bfsize,p;

// 角度
double angle;

complex <double > *W,*X1,*X2,*X;

// 计算付立叶变换点数
count = 1 < < r;

// 分配运算所需存储器
W = new complex <double >[count / 2];
X1 = new complex <double >[count];
X2 = new complex <double >[count];

// 计算加权系数
for(i = 0; i < count / 2; i++)
{
angle = -i * PI * 2 / count;
W[i] = complex <double > (cos(angle), sin(angle));
}

// 将时域点写入X1
memcpy(X1, TD, sizeof(complex <double >) * count);

// 采用蝶形算法进行快速付立叶变换
for(k = 0; k < r; k++)
{
for(j = 0; j < 1 < < k; j++)
{
bfsize = 1 < < (r-k);
for(i = 0; i < bfsize / 2; i++)
{
p = j * bfsize;
X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1 < <k)];
}
}
X = X1;
X1 = X2;
X2 = X;
}

// 重新排序
for(j = 0; j < count; j++)
{
p = 0;
for(i = 0; i < r; i++)
{
if (j&(1 < <i))
{
p+=1 < <(r-i-1);
}
}
FD[j]=X1[p];
}

// 释放内存
delete W;
delete X1;
delete X2;
}

/*************************************************************************
*
* 函数名称:
* IFFT()
*
* 参数:
* complex <double > * FD - 指向频域值的指针
* complex <double > * TD - 指向时域值的指针
* r -2的幂数
*
* 返回值:
* 无。
*
* 说明:
* 该函数用来实现快速付立叶反变换。
*
************************************************************************/
VOID WINAPI IFFT(complex <double > * FD, complex <double > * TD, int r)
{
// 付立叶变换点数
LONG count;

// 循环变量
int i;

complex <double > *X;

// 计算付立叶变换点数
count = 1 < < r;

// 分配运算所需存储器
X = new complex <double >[count];

// 将频域点写入X
memcpy(X, FD, sizeof(complex <double >) * count);

// 求共轭
for(i = 0; i < count; i++)
{
X[i] = complex <double > (X[i].real(), -X[i].imag());
}

// 调用快速付立叶变换
FFT(X, TD, r);

// 求时域点的共轭
for(i = 0; i < count; i++)
{
TD[i] = complex <double > (TD[i].real() / count, -TD[i].imag() / count);
}

// 释放内存
delete X;
}

---------------------------------------------------------------


alphapaopao 2003-04-26
  • 打赏
  • 举报
回复
时域到频域,幅度上没有你所说的限制。
转换后的数组大小应该根据你所需要的精度确定。因为频域的范围可能是无限的。


============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://www.betajin.com/alphasun/index.htm 给我发信息请附带原帖地址
http://alphasun.18en.com/ http://shakingtoolkit.9126.com/
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
kathywp 2003-04-26
  • 打赏
  • 举报
回复
kathywp 2003-04-26
  • 打赏
  • 举报
回复
谢谢,炮炮,您有这方面的资料吗,我还是没有理解,这个正玄函数的振幅应该是1吧,
A*sin(2*pi*w*t) ;里面A是振幅,当转成频域了怎么会无穷呢?
herrycsdn 2003-04-26
  • 打赏
  • 举报
回复
gz
alphapaopao 2003-04-26
  • 打赏
  • 举报
回复
kathywp(树欲静而风不止):
频率与里面出现无穷大幅值的都是有可能的。想象一下,一个sin(2*Pi*w*t)这样的函数被FFT,他的频率是w,那么变换之后w位置的幅值就是我穷大。
kathywp 2003-04-26
  • 打赏
  • 举报
回复
自从上次做了一个NUTS2000使用方法以来,得到广大NMR战友们的喜爱,由于懒惰,很久都没有写过有总结性的东西了,Mestrec版本到了4.9.9.9,已经停止了这个系列的开发,从5.0开始,现在已经改名为MestreNova了,虽然MestreNova在处理效果方面,比Mestrec上了一个档次,但是功能方面,好像还没有完善,因此到目前位置,我觉得还是有必要对Mestrec的使用方法做一下总结,毕竟现在大部分人都在用Mestrec,而且网上还没有一个像样的教程,有几个教程都没有涉及到二维的处理。因此我就花上几天的时间,在这里给大家做这个教程,呵呵。若有不对的地方,还希望大家指出来,我会虚心请教的。此教程首先发布在中国核磁共振论坛:http://www.nmrbbs.cn 本教程包括一维和二维的处理方法,图文并茂,希望大家喜欢。 本教程包括如下内容: 一、Mestrec一维处理教程 1、 运行软件 2、 打开Fid文件 3、 傅立叶变换 4、 相位矫正 5、 基线矫正 6、 图谱放大 7、 定标 8、 标注化学位移 9、 积分 10、添加注释 11、图谱叠加 12、添加放大图 13、拷贝到word文档 14、导出ascii码,以便origin画图 二、常用设置 1、 背景设置 2、 图谱设置,包括图谱、参数、横坐标、纵坐标、化学位移、积分等设置 三、Mestrec二维处理教程 1、 打开fid文件 2、 傅立叶变换 3、 二维谱边上调用一维图谱 4、 二维图谱放大 5、 其他操作和一维基本相同 湖北大学 柴仕淦 2008.4.28

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧