【OFDM系列】DFT为什么能求频率幅度谱?DFT后的X[k]与x(n)幅度的关系?DFT/IDFT底层数学原理?

news2025/1/17 6:08:49

文章目录

    • 问题引入
    • 铺垫一些小公式
    • DFT公式证明
      • DFT公式分解为4部分
        • 先考虑k1=0的情况:
        • 再考虑k1≠0的情况:
      • DFT计算后,X(k)与x(n)的关系:
    • Matlab FFT示例代码
    • IDFT公式证明
    • Matlab调用FFT/IFFT并绘图

问题引入

在这里插入图片描述
上面是DFT和IDFT的公式,IDFT先不谈。在实践中常使用FFT算法来快速算出DFT,获得时域采样信号x(n)的频率幅度谱。
例如:

N=1500;
xn=0.5*sin(2*pi*75/N*n)+3*cos(2*pi*40/N*n)+0.7*sin(2*pi*350/N*n);

上面这个时域采样信号xn由三个频率叠加而成,我们知道频率的概念是1秒信号经过了多少个周期,
那么我们假设采样率是fs=1000,共采样N=1500点,那么0.5*sin(2*pi*75/N*n)的频率即为75*fs/N=50,因此第一个信号频率为50。

通过Matlab进行FFT,可以画出这样一张频率幅度谱:
在这里插入图片描述
这里就引申出我们的标题:DFT为什么能求频率幅度谱?DFT后的X[k]与x(n)幅度的关系?DFT/IDFT底层数学原理?
对于这个问题,我看了不少网上的博客、视频、书籍,总觉得讲的不清不楚,有人说X[k]的结果就是x(n)的幅度,有人说X[k]的结果除以N就是x(n)的幅度,有人说X[k]的结果除以N/2就是x(n)的幅度,就没有一个比较清楚的证明到底X[k]的值和x(n)幅度的关系。
如果你也对此有疑问,现在我证明给你看!

铺垫一些小公式

要看懂我的证明,首先需要铺垫一些小公式,防止你不知道!
在这里插入图片描述

DFT公式证明

我将公式的证明整理成了PPT,下面我直接复制,在证明中使用到了上面铺垫的小公式,注意关联起来看就可以理解了!

DFT公式分解为4部分

在这里插入图片描述

先考虑k1=0的情况:

在这里插入图片描述

再考虑k1≠0的情况:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DFT计算后,X(k)与x(n)的关系:

在这里插入图片描述
可以看到,DFT公式本质上可以完全拆成三角函数的计算,在此过程中利用
高中的积化和差公式三角函数在若干个周期的累加为0
可以得到X[k]和原信号x(n)幅度的关系。

Matlab FFT示例代码

下面我们给出使用FFT对x(n)进行DFT计算后,绘制频率幅度谱的Matlab代码,看官可以发现,这上述公式的X(k)结果是完全对应的!

%功能说明:
%生成时域采样信号0.5sin(2pi*k/N*n)
%通过fft转化到频域,绘制频率幅度谱,横坐标是频率f=k*fs/N,纵坐标是实际幅度
%再通过ifft转化回时域,绘制ifft结果信号,和原信号进行对比
 
 
%采样率1000
fs=1000;
 
%在N个采样点中,一共振动了k个周期
k=75;
 
%采样总点数
N=1500;
 
%n表示采样的第n个点
n=0:N-1;

%xn是采样得到的x(n)时域信号
xn=0.5*sin(2*pi*k/N*n)+3*cos(2*pi*40/N*n)+0.7*sin(2*pi*350/N*n);

xk=fft(xn);

%abs是求模
P2=abs(xk/N);
P1=P2(1:N/2+1);
P1(2:end-1)=2*P1(2:end-1);
 
%半频谱 f=k*fs/N
f=fs*(0:(N/2))/N;
plot(f,P1) 
title("Single-Sided Amplitude Spectrum of X(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

IDFT公式证明

在这里插入图片描述

Matlab调用FFT/IFFT并绘图

%功能说明:
%生成时域采样信号0.5sin(2pi*k/N*n)
%通过fft转化到频域,绘制频率幅度谱,横坐标是频率f=k*fs/N,纵坐标是实际幅度
%再通过ifft转化回时域,绘制ifft结果信号,和原信号进行对比
 
 
%采样率1000
fs=1000;
 
%在N个采样点中,一共振动了k个周期
k=75;
 
%采样总点数
N=1500;
 
%n表示采样的第n个点
n=0:N-1;

%xn是采样得到的x(n)时域信号
xn=0.5*sin(2*pi*k/N*n)+3*cos(2*pi*40/N*n)+0.7*sin(2*pi*350/N*n);

xk=fft(xn);

%abs是求模
P2=abs(xk/N);
P1=P2(1:N/2+1);
P1(2:end-1)=2*P1(2:end-1);
 
%半频谱 f=k*fs/N
f=fs*(0:(N/2))/N;
plot(f,P1) 
title("Single-Sided Amplitude Spectrum of X(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

% 反傅里叶变换
X = ifft(xk, 'symmetric');

% 绘制输入信号和还原信号的图像
figure
subplot(2,1,1)
plot(n, xn)
title('Input Signal')
xlabel('Time (s)')
ylabel('Amplitude')

subplot(2,1,2)
plot(n, X)
title('Signal after IFFT')
xlabel('Time (s)')
ylabel('Amplitude')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用原生小程序组件Picker自定义日期时间选择器

使用原生小程序组件Picker自定义日期时间选择器 1、 Picker简单介绍 可以看到Picker类型有5种, 具体可以查看微信开放文档 picker。 Picker(选择器)是一种常见的用户界面控件,用于从多个选项中选择一个或多个选项。在小程序中&…

2023开学季买什么电容笔好?推荐好用不贵的电容笔

眼见开学季马上就要来了,那么该选哪款电容笔比较好呢?一款苹果原装pencil的售价,已经达到了近千元,这个价格,在许多人看来,实在是太高了。其实,因为平替电容笔价格很实惠,只需一两百…

flutter 中的动画详解 全网最全 动画一篇搞定 一万四千字

flutter 中的动画详解 全网最全 动画一篇搞定 前言一、 基础概念二、 隐式动画三、 显示动画四、 过渡五、 手势动画六、 复杂动画七、 自定义动画八、 物理动画九、 Flutter 动画库十、 动画性能和优化十一、 第三方动画库总结 前言 学习 Flutter 中的动画和过渡是构建流畅用户…

问道管理:2018年以来最低水平,A股质押风险大幅缓解

2018年A股质押巅峰期之后,金融监管“组合拳”继续发力,多地政府及金融安排活跃参加纾困,上市公司股票质押危险化解取得本质成效。A股上市公司现在质押股数量、质押市值、质押份额均降至2018年以来最低水平。 股权质押融资是出质人将股权作为质…

CentOS系统环境搭建(十四)——CentOS7.9安装elasticsearch-head

centos系统环境搭建专栏🔗点击跳转 关于node的安装请看上一篇CentOS系统环境搭建(十三)——CentOS7安装nvm,🔗点击跳转。 CentOS7.9安装elasticsearch-head 文章目录 CentOS7.9安装elasticsearch-head1.下载2.解压3.修…

0基础学习VR全景平台篇 第85篇:智慧眼-如何分配角色的权限?

一、功能说明 角色权限,是指给智慧眼的所有角色成员分配具体的操作权限。 二、后台编辑界面 1、点击“添加权限”,选择其可操作的“权限”。注意权限只能逐项选择,所以如果某个角色拥有多项权限的话,那么需要进行多次添加。“快…

Threejs学习02——使用dat.gui实现主动控制立方体相关操作

使用dat.gui实现主动控制立方体相关操作 这是一个非常简单基础的threejs的学习应用!在上一章学习threesj中我们实现立方体在坐标轴中来回移动,那都是通过我们的代码写死的效果,然后立方体的颜色都是通过代码写死的,这一章我们来给…

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API,MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips:了解内容 查看API文档,我们可以看到API文档中关于Math类的定义如下: Math类…

大数据大数据架构发展史

1.背景 随着数据量的暴增和数据实时性要求越来越高,以及大数据技术的发展驱动企业不断升级迭代,传统数仓经历了以下发展过程:传统数仓架构 -> 离线大数据架构 -> Lambda架构 -> Kappa架构 -> 新一代实时数仓。(大部分…

Vitis高层次综合学习——FPGA

高层次综合 什么是高层次综合?就是使用高级语言(如C/C)来编写FPGA算法程序。 在高层次综合上并不需要制定微架构决策,如创建状态机、数据路径、寄存器流水线等。这些细节可以留给 HLS 工具,通过提供输入约束&#xff…

ATX

导航 (返回顶部) 1. ATX (Advanced Technology Extended)2. 主板3. 电源 3.1 主要版本简表3.2 更换电源需要考虑的问题3.3 电源效率3.4 80 Plus 4. 退役的电源 4.1 24pin主供电接口4.2 12v的CPU供电接口4.3 12v的PCI-E供电接口4.4 SATA电源接口4.5 D型大4pin接口 1. ATX (Adv…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发,在项目构建的时候,控制台输出中文都是乱码,看着很不爽,进行了两项配置,中文就可以正常输出了,看起来就爽多了。 第一个配置:点击Help菜单…

冠达管理:A股利好!国家队最新出手!拜登紧急发声

号称“国家队”的大基金二期最新出手。 8月15日晚间,华润微公告,子公司润鹏半导体拟增资扩股并引进大基金二期等外部出资者,本次买卖完成后,润鹏半导体注册资本将由24亿元添加至150亿元。其间,大基金二期持股份额将达2…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置(经纬度)、速度。 但是返回参数中的address在app中才会显示,小程序中不会显示,所以我们需要进行逆解析其地址,解析出它的地址信息。 1.首先要在腾讯位置服务…

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)

项目准备开发个新功能,刚好很喜欢ruoyi写的任务调度,因此想到了集成ruoyi.quartz模块 ,遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块,因此第一步我需要把common模块一部分依赖项复制到了quartz模块内&#xf…

查看端口号被应用程序占用

打开资源监视器 找到被占用的端口,记住她的PID 打开任务管理器 把占用端口的程序关掉

SAP LTMC 批导创建物料

LTMC这个事务代码是HANA 版本的LSMW。其实就是一个批导工具 我们来用LTMC 来做一下物料的期初批导 1.首先在GUI中输入T-CODE : LTMC 2.输入你的账号密码和客户端之后会进入这个界面 3.点击CREATE 4.在下图框中的位置选择我们要进行的任务 5.download template 6.…

第六章:用FATE从零实现纵向线性回归

第六章 用FATE从零实现纵向线性回归 6.1 数据集的获取与描述6.2纵向数据集切分6.3 纵向联邦训练6.3.1 数据输入6.3.2 样本对齐6.3.3 模型训练 6.4 模型评估 代码 本章利用FATE从零开始实现一个简单的纵向线性回归模型,本章以实验为主。 与第5章一样,本章…

GEWE框架 ipad协议

GEWE框架 是一套完整的的第三方服务平台,包含微信API服务、企微API服务、SCRM系统定制、企微系统定制、服务类软件定制等模块,本文档主要讲述个微API服务相关,以下简称API,它能处理用户微信中的各种事件,提供了开发者…

使用VSCode的 Dev Containers 插件搭配Docker 容器进行开发环境的搭建

需要安装插件 https://marketplace.visualstudio.com/items?itemNamems-vscode-remote.remote-containers 安装Docker 这样做的好处 每一个项目可以运行一个容器,在容器内开发,相关之间node环境隔离,彻底解决本地包版本依赖关错乱问题共用…