(二):基二FFT

十分钟搞懂基-2 FFT原理及编程思想 十分钟弄懂FFT算法并学会编程 阅读详情

FFT:

这里使用基二FFT算法,非基二FFT难度有点大,等以后补充。

对于非2的幂次方长度的序列,我们采用的是补零法:即:我们的FFT只能用于分析或者产生频谱,而不能求得某一特定点的DFT。

首先定义复数操作,实际上,复数操作的定义非常繁琐,这里我只定义了在本次应用中能用到的操作:

const double PI=3.1415926;
const double prec=0.00001;//控制精度
const char MARK='j';//复数的标志符,工程上喜欢使用j,数学上喜欢使用i
//下面是复数结构,主要定义了加减乘除操作符
template<typename T>
class complex
{
public:

	T real;
	T imag;
public:
	complex(T a=T(),T b=T()):real(a),imag(b){ }
	//copy和copy assigment,析构函数可以使用编译器合成的
public:
	 inline complex conjugate()const;
	 inline T  module() const;
public:
	inline complex&  operator/=(int rhs);
};
template<typename T>
complex<T> operator+(const complex<T>& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs.real+rhs.real,lhs.imag+rhs.imag);
}
template<typename T>
complex<T> operator+(const int& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs+rhs.real,rhs.imag);
}
template<typename T>
complex<T> operator+(const complex<T>& lhs,const int& rhs)
{
	return complex<T>(lhs.real+rhs,lhs.imag);
}
template<typename T>
complex<T> operator+(const double& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs+rhs.real,rhs.imag);
}
template<typename T>
complex<T> operator+(const complex<T>& lhs,const double& rhs)
{
	return complex<T>(lhs.real+rhs,lhs.imag);
}
template<typename T>
complex<T> operator+(const T& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs+rhs.real,rhs.imag);
}
template<typename T>
complex<T> operator+(const complex<T>& lhs,const T& rhs)
{
	return complex<T>(lhs.real+rhs,lhs.imag);
}
//---------------------------------------------------------------------------
template<typename T>
complex<T> operator-(const complex<T>& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs.real-rhs.real,lhs.imag-rhs.imag);
}
template<typename T>
complex<T> operator-(const int& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs-rhs.real,-rhs.imag);
}
template<typename T>
complex<T> operator-(const complex<T>& lhs,const int& rhs)
{
	return complex<T>(lhs.real-rhs,lhs.imag);
}
template<typename T>
complex<T> operator-(const double& lhs,const complex<T>& rhs)
{
	return complex<T>(lhs-rhs.real,-rhs.imag);
}
template<typename T>
complex<T> oper
FFT算法原理(按时间抽取的基2算法) 离散傅里叶变换DFT的定义为:其中,x[n]是N点的采样序列,X[k]为N点的DFT计算结果,,而称为旋转因子。假设x[n]的采样频率为fs,那么得出的X[k]的模值和幅角可以代表 f = k*fs/N处的信号强度(非0Hz处,为幅值的N/2倍,0Hz处为幅值的N倍)和相位信息。具体的频率分量和它的幅值Am之间的关系为:可以看到,离散傅里叶变换的分辨率为fs/N,采样获得的频谱范围为可以看到DFT无法获得高于一半采样频率以上的分量信息。 阅读详情

相关推荐

实验二:FFT算法的MATLAB实现

实验内容: 题一:若x(n)=cos(n*pi/6)是一个N=12的有限序列,利用MATLAB计算它的DFT并画出图形。 clc; N=12; n=0:N-1; k=0:N-1; xn=cos(n*pi/6); WN=exp(-j*2*pi/N); nk=n'*k; WNnk=WN.^nk; XK=xn*WNnk plot(k,XK); xlabel('k'); ylabel('XK'); g

优快云Jay的博客 1万+

数字信号处理 实验二 用DFT、FFT进行频谱分析

离散信号频谱分析的DFT与FFT方法,掌握用Matlab离散信号的频谱分析

qq_67839211的博客 1652

实验二:fft算法的matlab实现_C语言系列之FFT算法实现

0x10 序言 长文预警,详细介绍FFT算法的编程原理和C实现,并在文章的最后附上了本文的所有源代码。0x11 速览1)FFT背后的数学原理2)码位倒序3)蝶形运算设计4)利用复数FFT编写复数IFT,实数FFT和实数IFFT5)总结0x20 FFT背后的数学原理01前言本文阅读前提知识准备:已经初步了解傅里叶变换。傅里叶变换公式: 本文不刨根问底,只讲跟FFT编程相关必须知道的知识,相...

weixin_39973410的博客 2981

数字信号处理:FFT中一些细节的理解

1.怎么理解Wnk?Wnk可以理解为在R=1的圆周上,等距离地取n个点,这些复平面上的点和复数是一一对应的。由此可以直观理解Wnk的大部分性质。 2.基二FFT的输入和输出序列怎么排序? 按频域抽取使用的输入是前序列,输出后序列。 按时域抽取使用的输入是后序列,输出前序列。 由前序列产生后序列的规律是 ​ ...

卡布奇诺泡泡糖的博客 2956

基2-FFT算法

这个例程是我参考网上各位大牛写的,不能说参考,基本上是照抄吧,只是移植到VB平台上而已,当然你们也可以改成C语言,很简单。 该FFT采用基2提高DFT计算速度,提高离散数据分析效率,直接进行DFT计算,那是相当费时费力。 希望对初学者有用。

任意长度FFT算法C++源代码

任意长度FFT算法C++源代码,验证正确有效,运行速度快

无刷直流电机计算转速

一个霍尔传感器周期(Tms)有两种模式输出方式(3FG/1FG),一个电周期是6个60°电角度,电机磁极数是P,磁极对数PP = P / 2 3FG模式: 1个电周期= 6 * T 1FG模式: 1个电周期= 2 * T 1秒钟电周期个数: 1分钟电周期个数: 1分钟转速: 举例: 假设电机磁极数是8,3FG模式下,霍尔周期700us,计算该条件下转速 ...

meimiaorenshengqq的博客 9682

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7502

Cube生成定时器2触发双ADC同步采集并用DMA传输

前言 用cube生成一个用定时器触发ADC1,ADC2同步采集的程序,单片机选择的是STM32L476RGT6,用定时器2进行ADC采集触发,更改定时器2的定时周期便可以更改ADC的采样周期,ADC1和ADC2使用同步规则模式,并用DMA进行数据的传输。 STM32的ADC采样完成总共需要的时间是 ADC完成采样时间=采样周期+12个转换周期 举个例子,假如ADC的时钟是15MHz,采样周期是3个周期,3个采样周期加上12个转换周期,一共是15个周期,因为时钟是15MHz,所以完成一次ADC转换总共需要的时

一行代码的博客 4513

工程师必看:如何用MINITAB快速计算传感器寿命(附详细步骤)

本文为工程师提供了使用MINITAB软件快速计算传感器寿命的详细实战指南。文章重点阐述了如何通过数据预处理、回归分析拟合阿伦尼斯模型,并最终预测平均寿命与置信区间,帮助工程师高效处理加速寿命试验数据,提升可靠性分析工作的准确性与效率。

weixin_29296241的博客 248

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 485

Moltbot 超详细安装使用教程(初学者版)

你在外面逛街,用微信/Telegram 发消息说"帮我查一下明天的天气"它立刻帮你查好并回复你说"帮我在电脑上新建一个文件夹叫'工作文档'"它真的帮你在电脑上创建了这就是 Moltbot ——一个能真正帮你干活的 AI 助手。API Key 就像是一把"钥匙",让 Moltbot 能够使用 AI 服务。

weixin_51040479的博客 2015

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

A2L文件的生成分为两章讲解:本文主要是讲模型开发,讲解如何把标定量、观测量放到链接文件中的指定位置。下一篇讲解如何使用matlab生成完整的A2L文件

认真搞搞汽车MCU 4618

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 算法导论第13章-红黑树
下一篇: (-):wav文件转化为txt文件
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值