自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

在matlab中有自带的离散傅里叶变换程序,即fft程序,但该程序是封装的,无法看到源码。为了比较清楚的了解matlab自带的实现过程,本文通过自建程序实现matlab程序,并与matlab自带的fft进行比较计算。

一、离散傅里叶变换的计算公式

在计算离散傅里叶变换的时候,通常会用到:
{ X ( k ) = ∑ n = 1 N [ x ( n ) ⋅ exp ⁡ ( − i ⋅ 2 π ( k − 1 ) ( n − 1 ) N ) ] s . t . { 1 ≤ k ≤ N } (1) \left\{ \begin{array}{l}X(k) = \sum\limits_{n = 1}^N {[x(n) \cdot \exp ( - i \cdot 2\pi \frac{{(k - 1)(n - 1)}}{N})]} \\s.t.\{ 1 \le k \le N\} \end{array} \right. \tag1 X(k)=n=1N[x(n)exp(i2πN(k1)(n1))]s.t.{1kN}(1)进行求解。
但有时会遇到所求解的向量长度N和变换过程中的长度K,大小不同。此时,会遇到 N ≤ K N\le K NK的情况,和N>K的两种情况。

(1) 当 N ≤ K N\le K NK时,则需要对向量 x x x补零后,再离散傅里叶变换计算。计算公式为:

{ X ( k ) = ∑ n = 1 N p a d d e d [ x ( n ) ⋅ exp ⁡ ( − i ⋅ 2 π ( k − 1 ) ( n − 1 ) N p a d d e d ) ] s . t . { 1 ≤ k ≤ N p a d d e d } (2) \left\{ \begin{array}{l}X(k) = \sum\limits_{n = 1}^{{N_{padded}}} {[x(n) \cdot \exp ( - i \cdot 2\pi \frac{{(k - 1)(n - 1)}}{{{N_{padded}}}})]} \\s.t.\{ 1 \le k \le {N_{padded}}\} \end{array} \right. \tag2 X(k)=n=1Npadded[x(n)exp(i2πNpadded(k1)(n1))]s.t.{1kNpadded}(2)
易知: N ≤ N p a d d e d = K N \le {N_{padded}}=K NNpadded=K.

(2) 当N>K时,,则需要对向量 x x x截断后,再离散傅里叶变换计算。计算公式为:

{ X ( k ) = ∑ n = 1 N t r u n c a t e d [ x ( n ) ⋅ exp ⁡ ( − i ⋅ 2 π ( k − 1 ) ( n − 1 ) N t r u n c a t e d ) ] s . t . { 1 ≤ k ≤ N t r u n c a t e d } (3) \left\{ \begin{array}{l}X(k) = \sum\limits_{n = 1}^{{N_{truncated}}} {[x(n) \cdot \exp ( - i \cdot 2\pi \frac{{(k - 1)(n - 1)}}{{{N_{truncated}}}})]} \\s.t.\{ 1 \le k \le {N_{truncated}}\} \end{array} \right. \tag3 X(k)=n=1Ntruncated[x(n)exp(i2πNtruncated(k1)(n1))]s.t.{1kNtruncated}(3)
易知: N > N t r u n c a t e d = K N > {N_{truncated}}=K N>Ntruncated=K.

二、基于上述理论编写myfft函数(matlab编程)

将自建的离散傅里叶变换的函数命名为myfft,编写程序如下:

function X=myfft(x,K)
% myfft函数根据傅里叶变换公式编写的离散傅里叶变换程序
% 输入
%     x:向量x
%     K: 变换后的向量X的长度

% 输出
%    X: 经过傅里叶变换得到的向量

% 变换依据:
% 对于长度为N的输入向量x,其离散傅里叶变换是长度为N的向量X,其具有元素:
%                    N
%      X(k) =       sum  x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
%                   n=1
%  myfft(x,K) 是一个K点的FFT,如果x小于K点,则补零后进行傅里叶变换;如果x大于K点,则截断后傅里叶变换。

%  by zddh and zsm
%  2023.10.24

N=length(x)

%% 1.如果x小于K点,补零运算
if N<=K
    x_padded=[x,zeros(1,K-N)];   %补零
    N_padded=length(x_padded);   %补零后的长度
    X=zeros(1,N_padded);         
for k=1:K
    for n=1:N_padded
    temp1=x_padded(n)*exp(-i*2*pi*(k-1)*(n-1)/N_padded);
    X(k)=X(k)+temp1;
    end
end
%% 2.如果x大于K点,则截断计算
else
   warning('K值小于N,则截断后进行傅里叶变换')
x_truncated=x(1:K);
N_truncated=length(x_truncated);
X=zeros(1,N_truncated)
for k=1:K
    for n=1:N_truncated
    temp2=x_truncated(n)*exp(-i*2*pi*(k-1)*(n-1)/N_truncated);
    X(k)=X(k)+temp2;
    end
end
end

三、自建的函数和matlab自带函数比较举例

(1) 编写程序

clc
clear all
close all
%% 1.构造将要变换的向量
dt=0.1
t=0:dt:10*pi;
x=sin(t)
N=length(x);
figure(1)
plot(t,x,'lineWidth',2)

%% 2.自建的离散傅里叶变换求解
K=200
X=myfft(x,K)
%% 3.matlab自带函数求解
X0=fft(x,K)


%% 4.比较
D_value=X-X0;

figure(2)
subplot(211)
plot(abs(X),'LineWidth',2)
hold on
plot(abs(X0),'LineWidth',2)
legend('myfft','matlabfft')
title('自建myfft和matlab自带函数fft比较')

subplot(212)
plot(abs(D_value),'LineWidth',2)
title('|X-X0|')

(2)运行结果

图1 生成的x向量
图1 生成的x向量

图2 使用两种方法结果比较
图2 使用两种方法结果
通过对图2两个子图观察比较可知,本文所编写的myfft函数和matlab自带的fft函数之间的误差非常小,在 1 0 − 12 10^{-12} 1012量级,同时验证了程序的理论公式(1)、(2)和(3).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/104060.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 2023.2正式发布,新UI和Profiler转正

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 北京时间2023年7月26日&#xff0c;IntelliJ IDEA 2023.2正式发布。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这几碗汤干了&#xff0c;更有助于消化&#xff08;每篇都很顶哦…

排序-表排序

当我们需要对一个很大的结构体进行排序时&#xff0c;因为正常的排序需要大量的交换&#xff0c;这就会造成时间复杂度的浪费 因此&#xff0c;我们引入指针&#xff0c;通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路&#xff1a;通过开辟一个指针数组&…

十个最常用的计算机视觉数据集

如今&#xff0c;人工智能和机器学习领域中最振奋人心的一个分支是计算机视觉&#xff08;Computer Vision&#xff0c;简称CV&#xff09;。CV应用于多种场景&#xff0c;以改善我们的日常生活&#xff0c;并推进科学技术研究。其中包括&#xff1a; 自动驾驶自动生成图像描述…

重入漏洞EtherStore

重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…

Linux 函数调用的用户态与内核态

在用户态中&#xff0c;程序的执行往往是一个函数调用另一个函数。函数调用都是通过栈来进行的。 在进程的内存空间里面&#xff0c;栈是一个从高地址到低地址&#xff0c;往下增长的结构&#xff0c;也就是上面是栈底&#xff0c;下面是栈顶&#xff0c;入栈和出栈的操作都是…

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关&#xff0c;在 Profinet 侧做为 Profinet 主站控制器&#xff0c;接 Profinet 设备&#xff0c;如伺服驱动器&#xff1b;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站&#xff0c;接 PLC、上位机、wincc 屏等。 拓…

k8s kubeadm配置

master 192.168.41.30 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.41.31 docker、kubeadm、kubelet、kubectl、flannel node02 192.168.41.32 do…

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…

Python:实现日历到excel文档

背景 日历是一种常见的工具,用于记录事件和显示日期。在编程中,可以使用Python编码来制作日历。 Python提供了一些内置的模块和函数,使得制作日历变得更加简单。 在本文,我们将探讨如何使用Python制作日历,并将日历输出到excel文档中。 效果展示 实现 在代码中会用到cale…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下&#xff0c;让函数、接口或类与多种类型一起工作&#xff0c;从而实现复用 基本使用 举个例子&#xff1a; 创…

各品牌PLC存储器寻址的规则

在PLC编程时&#xff0c;字节或多字节的变量一般支持绝对地址寻址&#xff08;比如&#xff0c;IW0、MD4等&#xff09;。要想正确寻址&#xff0c;则必须要搞清楚寻址的规则。目前常见的规则有两种&#xff1a;字节寻址和字寻址。下图清晰地表达了两种规则的编号情况&#xff…

【C++】stackqueue

适配器是一种设计模式 &#xff0c; 该种模式是将一个类的接口转换成客户希望的另外一个接口 。 虽然 stack 和 queue 中也可以存放元素&#xff0c;但在 STL 中并没有将其划分在容器的行列&#xff0c;而是将其称为 容器适配 器 &#xff0c;这是因为 stack 和队列只是对其他容…

上传和下载文件到google drive/Local pc

1 上传 参考&#xff1a;使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用&#xff0c;但可以参考一下) 第 1 步&#xff1a;Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

出海路上离不开的Email营销,教你这样来优化!

随着互联网的不断发展&#xff0c;Email已经成为人们工作和生活中不可或缺的一部分。尤其是对于我们这些跨境企业而言&#xff0c;发送Email是一个促进销售和维护客户关系的良好渠道。而且邮件的价格也是比较低廉的&#xff0c;很适合用于日常推广营销&#xff0c;所以人手几个…

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接&#xff1a; https://arxiv.org/abs/2008.08370 目录 摘要&#xff1a; Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要&#xff1a; 协调的在线行为是信息…

嵌入式软件工程师面试题——2025校招专题(三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

在nodejs中实现实时通信的几种方式

在nodejs中实现实时通信的几种方式 在当今世界中&#xff0c;实时通信至关重要。无论是聊天应用程序还是实时体育更新&#xff0c;实时通信都是保持用户活跃度所必需的。Node.js 因其速度、可扩展性和可靠性而成为开发实时应用程序的流行工具。在本文中&#xff0c;我们将探讨…

爬虫进阶-反爬破解7(逆向破解被加密数据:全方位了解字体渲染的全过程+字体文件的检查和数据查看+字体文件转换并实现网页内容还原+完美还原上百页的数据内容)

目录 一、全方位了解字体渲染的全过程 1.加载顺序 2.实践操作&#xff1a;浏览器中调试字体渲染 3.总结&#xff1a; 二、字体文件的检查和数据查看 1.字体文件的操作软件 2.映射关系的建立 3.实践操作&#xff1a;翻找样式和真实内容 4.总结&#xff1a; 三、字体文…

Tp框架如何使用事务和锁,还有查询缓存

1.事务 在ThinkPHP框架中&#xff0c;可以使用think\db\Transaction类来实现事务。 use think\Db; use think\db\Transaction;// 开始事务 Db::startTrans();try {// 执行数据库操作Db::table(user)->where(id, 1)->update([name > John]);// 提交事务Db::commit(); }…