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

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(振幅)的值?(请优先回答这个)
请大家帮我看看我的频率取的可以满足要求么?
谢谢各位!
...全文
139 17 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复

16,550

社区成员

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

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

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