求VC实数序列FFT

youyou_zh 2005-09-12 09:57:04
求VC中的MFC编写的实数序列FFT,及输出X轴是频率,Y轴是幅值的波形图。本人做课题
急需,谢谢!
...全文
343 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nini_liu 2005-09-23
  • 打赏
  • 举报
回复
路过,顶
youyou_zh 2005-09-15
  • 打赏
  • 举报
回复
求VC中的MFC编写的实数序列FFT,及输出X轴是频率,Y轴是幅值的波形图。本人做课题
急需,谢谢!
youyou_zh 2005-09-15
  • 打赏
  • 举报
回复
那位好心人帮我解释一下上面的问题,谢谢!
youyou_zh 2005-09-14
  • 打赏
  • 举报
回复
i_noname(晚九朝五):你好!
可不可以告诉我,我采集的时域里1024个点的值,我要这些值给一下程序中的那一个才能得到我想要的FFT变换后的结果,输出是什么?输出和频率的关系是什么?还有这个程序是频率抽取基2FFT算法吧?这里的蝶运算对吗?有点不明白。谢谢!
// internal definitions

#define PI (double)3.14159265359

/*complex number*/
typedef struct
{
double re;
double im;
}COMPLEX;

/*complex add*/
COMPLEX Add(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return c;
}

/*complex substract*/
COMPLEX Sub(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re-c2.re;
c.im=c1.im-c2.im;
return c;
}

/*complex multiple*/
COMPLEX Mul(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.re*c2.im+c2.re*c1.im;
return c;
}
//////////////////////////////////////////////////////////



这是FFT/****************************************************
FFT()

参数:

TD为时域值
FD为频域值
power为2的幂数

返回值:



说明:

本函数实现快速傅立叶变换
****************************************************/
void FFT(COMPLEX * TD, COMPLEX * FD, int power)
{
int count;
int i,j,k,bfsize,p;
double angle;
COMPLEX *W,*X1,*X2,*X;

/*计算傅立叶变换点数*/
count=1<<power;

/*分配运算所需存储器*/
W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2);
X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count);

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

/*将时域点写入存储器*/
memcpy(X1,TD,sizeof(COMPLEX)*count);

/*蝶形运算*/
for(k=0;k<power;k++)
{
for(j=0;j<1<<k;j++)
{
bfsize=1<<(power-k);
for(i=0;i<bfsize/2;i++)
{
p=j*bfsize;
X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);
X2[i+p+bfsize/2]=Mul(Sub(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<power;i++)
{
if (j&(1<<i)) p+=1<<(power-i-1);
}
FD[j]=X1[p];
}

/*释放存储器*/
free(W);
free(X1);
free(X2);
}


/****************************************************
IFFT()

参数:

FD为频域值
TD为时域值
power为2的幂数

返回值:



说明:

本函数利用快速傅立叶变换实现傅立叶反变换
****************************************************/
void IFFT(COMPLEX * FD, COMPLEX * TD, int power)
{
int i, count;
COMPLEX *x;

/*计算傅立叶反变换点数*/
count=1<<power;

/*分配运算所需存储器*/
x=(COMPLEX *)malloc(sizeof(COMPLEX)*count);

/*将频域点写入存储器*/
memcpy(x,FD,sizeof(COMPLEX)*count);

/*求频域点的共轭*/
for(i=0;i<count;i++)
x[i].im = -x[i].im;

/*调用FFT*/
FFT(x, TD, power);

/*求时域点的共轭*/
for(i=0;i<count;i++)
{
TD[i].re /= count;
TD[i].im = -TD[i].im / count;
}

/*释放存储器*/
free(x);
}
i_noname 2005-09-13
  • 打赏
  • 举报
回复
网上搜索FFT,代码很多,如果对运算速度不是很在乎的话大部分都能满足使用。

实数序列FFT,只要把虚部设为0即可。

对于转换出来的数据
频率是和你时域采样时间间隔有关的,f = 1/t
幅值则为复数的模
i_noname 2005-09-13
  • 打赏
  • 举报
回复
假设现在你以 T /s采样,则你采样的频率范围是Freq HZ,当你以每frame个点进行FFT,则每个点的频率间隔是:Freq/frame.第N个点代表的频率是 n*Freq/frame.
实例:
5000/s采样,得到数据x[0] - x[4999]
512为一组进行FFT,x --(fft)-> X
得到X[0] - X[511];
X[100]代表的频率是:100 * 5000 / 512
X[234]代表的频率是:234 * 5000 / 512
因为它们每个点的频率间隔都是5000/512
youyou_zh 2005-09-13
  • 打赏
  • 举报
回复
i_noname(晚九朝五):你好!我是搜到了一个算法,但是没有注释,我的能力有限所以看不懂。我想找的算法当然是分裂基算法是最好了,可我没找到。我的最大的问题是不知道怎么把输出画成x轴是频率,Y轴是幅值的波形图。这样我可以找到幅值最大时的频率。
代码下载地址: https://pan.quark.cn/s/e828ad01234a JLink与JTAG是两种在嵌入式系统调试领域得到普遍应用的接口技术,它们为开发者提供了对微控制器进行编程、调试以及故障诊断的能力。本文旨在对这两种接口的功能机制、定义规范以及实际应用中的异同点进行细致的剖析。JTAG(联合测试行动组)是一项国际性的标准,其原始设计目的是为了电路板级别的检测,但当前更多地被用于程序的下载和调试过程。该接口通过TMS(测试模式选择)、TCK(测试时钟)、TDI(测试数据输入)、TDO(测试数据输出)和TRST(测试复位)等信号线来完成数据的输入与输出任务。其中,TCK负责提供时钟脉冲,TMS用于控制测试逻辑的状态,TDI将数据传送至设备内部,TDO用于接收设备反馈的数据,而TRST则作为一个可选的外部复位信号。JLink是由Segger公司设计并推广的一种流行的JTAG/SWD(SWD:串行线调试)调试设备。与JTAG相比,SWD接口的设计更为精简,仅需两根线缆(SWDIO和SWDCLK)即可完成数据传输与时钟同步的功能,从而有效节约了硬件资源,对于资源受限的嵌入式系统尤为适用。JLink能够兼容多种微控制器和操作系统,并提供了高速的调试速度以及包括仿真、内存编程、在线电压检测在内的一系列丰富功能。在20引脚的JTAG接口规格中,除了标准的JTAG信号外,还可能包含电源供应、地线连接以及用户可定义的引脚。此类接口常用于传统的JTAG调试场景,适合需要大量信号线的应用环境。相反,14引脚的接口规格可能是在20引脚的基础上进行了简化处理,去除了部分非关键的信号线,以便在空间布局紧凑的环境中部署。在具体操作层面,JLink能够通过USB接口与个人计算...
源码直接下载地址: https://pan.quark.cn/s/fd3758fd4dad Greenplum是一个为大数据分析而构建的开源MPP(大规模并行处理)数据库系统。该系统具备处理PB级数据的能力,并且提供高效的在线分析处理(OLAP)功能。本部分将深入探讨Greenplum的高可用性、安全防护措施以及备份方法。Greenplum的高可用性设计体现在其包含了多层次的容错体系,涵盖了硬件和软件两个层面的容错需。在硬件配置上,Greenplum建议部署两台管理节点,其中一台作为主节点,另一台作为备用(Standby)节点,这两者之间能够实现自动化的数据同步。一旦主节点发生故障,系统可以自动切换至备用节点,从而保障数据库的持续运行。在数据节点层面,Greenplum运用镜像技术,将primary实例的数据自动复制到其他数据节点的mirror实例中。若primary实例出现故障,系统可自动识别并启动相应的mirror实例,以此确保数据的完整性以及服务的可用性。除此之外,为了降低硬件故障对系统的影响,Greenplum数据库通常采用双台网络交换机的部署方案。在常规操作中,两台交换机协同工作,达成负载均衡的目的;当一台交换机出现故障时,另一台交换机能够提供备份支持。对于服务器硬件,Greenplum数据库要实施冗余保护措施,涉及风扇(Fan)和电源供应单元(PSU)等组件,并且采用Raid5磁盘阵列技术来保护存储数据。当需要更换新的硬盘时,Raid5能够自动完成数据的重建。在系统表和视图的管理上,Greenplum维护了多个关键系统表和视图,例如gp_segment_configuration用于记录包括master和standby在内的所有节点信息,当节点状态显...

16,551

社区成员

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

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

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