[ MATLAB ] 傅里叶变换(三):傅里叶变换_傅里叶变换可视化,plot3函数,matlab-程序员宅基地

技术标签: matlab  算法  MATLAB通信基础  开发语言  

前言

专题的前两篇文章( [ MATLAB ] 傅里叶变换(二):傅里叶级数(复指数表示)),我们讨论了连续周期信号傅里叶级数的两种表示形式,初步建立了频谱的概念。然而,就实际经验而言,非周期信号才是主流。因此,这篇文章将讨论非周期连续信号的谱密度(通常简称为频谱),即大名鼎鼎的傅里叶变换FT,并用Matlab仿真加强理解。

理论回顾

首先,我们借助傅里叶级数 → \to 傅里叶变换的过程,回顾一下傅里叶变换的基本数学知识

x ( t ) x(t) x(t)是周期连续信号,周期为 T T T,模拟角频率 Ω 0 = 2 π T \Omega_0 = \frac{ {2\pi }}{T} Ω0=T2π,则 x ( t ) x(t) x(t)的傅里叶级数为:
正变换 : X ( j k Ω 0 ) = 1 T ∫ 0 T x ( t ) e − j k Ω 0 t d t 正变换: X\left( {jk{\Omega _0}} \right) = \frac{1}{T}\int\limits_0^T {x\left( t \right){e^{ - jk{\Omega _0}t}}dt} 正变换:X(jkΩ0)=T10Tx(t)ejkΩ0tdt
反变换 : x ( t ) = ∑ k = − ∞ ∞ X ( j k Ω 0 ) e j k Ω 0 t 反变换:x\left( t \right) = \sum\limits_{k = - \infty }^\infty {X\left( {jk{\Omega _0}} \right){e^{jk{\Omega _0}t}}} 反变换:x(t)=k=X(jkΩ0)ejkΩ0t
现在考虑 x ( t ) x(t) x(t)非周期信号,即 T → ∞ T \to \infty T,此时 Ω 0 → 0 \Omega_0\to0 Ω00 Ω 0 \Omega_0 Ω0可视作相邻谱线的频率间隔 ( k + 1 ) Ω o − k Ω 0 (k+1)\Omega_o-k\Omega_0 (k+1)ΩokΩ0,因此, k Ω o = Ω k\Omega_o=\Omega kΩo=Ω,代入正变换可得
X ( j Ω ) ′ = 1 T ∫ − ∞ ∞ x ( t ) e − j Ω t d t X\left( {j\Omega } \right)' = \frac{1}{T}\int\limits_{ - \infty }^\infty {x\left( t \right){e^{ - j\Omega t}}dt} X(jΩ)=T1x(t)ejΩtdt
显然, X ( j Ω ) ′ X\left( {j\Omega} \right)' X(jΩ)是一个无穷小量,即 x ( t ) x(t) x(t)的频率分量振幅无穷小。但是,无穷小之间仍然有相对大小。令
X ( j Ω ) = T X ( j Ω ) ′ = ∫ − ∞ ∞ x ( t ) e − j Ω t d t X\left( {j\Omega} \right)=TX\left( {j\Omega} \right)'= \int\limits_{ - \infty }^\infty {x\left( t \right){e^{ - j\Omega t}}dt} X(jΩ)=TX(jΩ)=x(t)ejΩtdt
X ( j Ω ) X\left( {j\Omega} \right) X(jΩ)即为频率分量的相对大小,称其为 x ( t ) x(t) x(t)频谱密度(通常简称为频谱)。上式同样被称为FT的正变换,给出完整的FT正反变换表达式:
正变换 : X ( j Ω ) = ∫ − ∞ ∞ x ( t ) e − j Ω t d t 正变换:X\left( {j\Omega } \right) = \int\limits_{ - \infty }^\infty {x\left( t \right){e^{ - j\Omega t}}dt} 正变换:X(jΩ)=x(t)ejΩtdt

反变换 : x ( t ) = 1 2 π ∫ − ∞ ∞ X ( j Ω ) e j Ω t d Ω 反变换:x\left( t \right) = \frac{1}{ {2\pi }}\int\limits_{ - \infty }^\infty {X\left( {j\Omega } \right){e^{j\Omega t}}d\Omega } 反变换:x(t)=2π1X(jΩ)ejΩtdΩ
这一小节,从数学角度简单分析了FT的由来。相信很多铁子们仍然对谱密度这个概念有些困惑,这将在下面的Matlab仿真中进行梳理验证。

Matlab仿真常见信号的频谱

这里算是开胃小菜,我们用Matlab仿真两个非周期信号的傅里叶变换。

(1)连续时间信号 x ( t ) = t e − ∣ t ∣ x\left( t \right) = t{e^{ - \left| t \right|}} x(t)=tet,求出其频谱并绘制幅度谱;

(2)某信号的频谱表达式为 X ( j Ω ) = π e − ∣ Ω ∣ X\left( {j\Omega } \right) = \pi {e^{ - \left| \Omega \right|}} X(jΩ)=πeΩ ,求出其时域表达式并绘制图像;

syms t w;  

f1 = t*exp(-abs(t));  % 时域表示
subplot(2,2,1);ezplot(f1);
F1 = fourier(f1);  % 正变换
subplot(2,2,2);ezplot(abs(F1));

F2 = pi*exp(-abs(w));  % 频域表示
subplot(2,2,3);ezplot(abs(F2));
f2 = ifourier(F2);  % 反变换
subplot(2,2,4);ezplot(f2);

在这里插入图片描述

Matlab探索谱密度概念

前面的公式推导可以看出,单个频率分量对应的幅值趋近于0,并且频率分量数量趋近于无穷,因此我们用傅里叶变换得到的是谱密度

谱密度完全可以类比于物理中的密度。举例说明,想象有一块石头,我们很容易算出他的密度是多少,但是我们取石头上非常非常小的一块,它的质量趋于0它的体积也趋于0。这时就要引出密度的概念了,无穷小的质量/无穷小的体积得到的常数,就是这一小块的密度了。

现在,我们想知道石头中某一小块的质量,即便这一小块体积非常非常小,还是需要测量某一体积的石头对应的质量。因此,如果需要获得某一频率分量对应的幅值,必须要用该分量的谱密度值乘以采样频率区间宽度。采样频率区间宽度类比于某一小块石头的体积,分量幅值类比于质量,谱密度类比于密度。
下面的仿真中,假设矩形脉冲信号的谱密度已知;用分量的谱密度值乘以采样频率区间宽度,得到分量的幅值;最后叠加所有分量,还原矩形脉冲信号。

  • step 1 划分采样区间和采样间隔
syms t;  
f = rectangularPulse(t);  % 矩形脉冲信号,原信号

st = 0; ed = 500;  % 频域采样区间
components_num = 5000;  % 频域采样项数
freqs = zeros(1,components_num);  % 分量频率/采样频率
width = (ed-st)/components_num;  % 区间宽度
sample_intervals = linspace(st,ed,components_num+1);  % 分割采样区间
for idx=1:length(sample_intervals)-1
    freq = sample_intervals(idx)+(sample_intervals(idx+1)-sample_intervals(idx))/2;
    freqs(idx) = freq;                   
end

step 2 计算频谱值并乘以频率区间,从而得出分量幅值,叠加近似

F = fourier(f);  % 傅里叶变换
F_function = matlabFunction(F);
components = sym('c',[1,components_num]);  % 分量
idx = 1;
for freq=freqs
    amp_weight = F_function(freq);  % 幅值密度
    amp = 2*abs(amp_weight)*width/2/pi;  % 密度+搬移, 注意除以2pi(反变换表达式)
    ang = angle(amp_weight);
    component = amp*cos(freq*t+ang);  
    components(idx) = component;
    idx = idx+1;
end

在这里插入图片描述
在这里插入图片描述
随着我们采样的频率范围越大,采样数量(分量数量)越多,叠加得到的信号愈发逼近原始的矩形脉冲信号,验证成功。从上面仿真中,我们也可以发现,谱密度也可以理解为权重,即谱密度越大,乘以相同采样间隔后,得到的分量幅值也就越大。

仿真总结

  1. 可以采用物理中的密度的方式类比谱密度的概念,从而理解傅里叶变换中谱密度的意义。
  2. 不需要再执着于分量幅值的绝对大小,而是聚焦于相对大小。
  3. 目前我们成功的实现了连续非周期时间信号的频谱变换,但是计算机运算中,仍然喜欢离散的有限值,下面我们将对连续时间信号进行离散化,引出离散时间傅里叶变换的概念(DTFT)的概念,由与频域和时域均是离散的目标进了一步。

创作不易,希望铁子们可以给出宝贵的建议,这将是我这个小菜猫不断前进的动力,谢谢!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pgqmml/article/details/137292191

智能推荐

手把手教你开发第一个HarmonyOS (鸿蒙)移动应用_鸿蒙移动应用开发-程序员宅基地

文章浏览阅读1.9w次,点赞44次,收藏268次。AndroidIOSHarmonyOS (鸿蒙)文档概览-HarmonyOS应用开发官网2.1.1 系统的定位搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终端,让设备的硬件能⼒可以弹性 扩展,实现设备之间 硬件互助,资源共享。对消费者⽽⾔,HarmonyOS能够将⽣活场景中的各类终端进⾏能⼒整合,实现不同终端 设备之间的快速连接、能⼒互助、资源共享,匹配合适的设备、提供流畅的全场景体验。⾯向开发者,实现⼀次开发,多端部署。_鸿蒙移动应用开发

AndroidStudio无代码高亮解决办法_android studio 高亮-程序员宅基地

文章浏览阅读2.8k次。AndroidStudio 升级到 4.2.2 版本后,没有代码高亮了,很蛋疼。解决办法是:点开上方的 File,先勾选 Power Save Mode 再取消就可以了。_android studio 高亮

swift4.0 valueForUndefinedKey:]: this class is not key value coding-compliant for the key unity.'_forundefinedkey swift4-程序员宅基地

文章浏览阅读1k次。使用swift4.0整合Unity出现[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key unity.'在对应属性前加@objc 即可。或者调回swift3.2版本_forundefinedkey swift4

Spring Security2的COOKIE的保存时间设置_springsecurity 设置cookie失效时间-程序员宅基地

文章浏览阅读1.3k次。http auto-config="true" access-denied-page="/common/403.htm"> intercept-url pattern="/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/> form-login login-page="/login.jsp" defau_springsecurity 设置cookie失效时间

view滑动冲突解决实战篇2(外部拦截法)_viewpage2外部拦截事件-程序员宅基地

文章浏览阅读1.1k次。继上篇内部拦截法需求还是跟上篇一样。只不过这次用外部拦截法来解决;只要在父容器添加如下代码就可以解决了滑动冲突,很简单,套模板就行 // 分别记录上次滑动的坐标(onInterceptTouchEvent) private int mLastXIntercept = 0; private int mLastYIntercept = 0; @Override public bo_viewpage2外部拦截事件

汇编 堆栈 变量存储 指针_汇编语言栈指针-程序员宅基地

文章浏览阅读2.5k次,点赞7次,收藏9次。本文章系作者原创,未经许可,不得转载。汇编 堆栈 变量存储 指针先说栈的概念,栈其实也是一种。。。。。先说内存的概念吧。。。。。额 先说计算机吧,简单来说的话,可以把计算机理解成由CPU,内存,硬盘组成,而CPU内部又包括一种叫做内部寄存器的东西,包括 数据寄存器: AX,BX,CX,DX; 段寄存器: CS,DS,ES,SS; 指针与变址寄存器SP,BP,SI,DI; ..._汇编语言栈指针

随便推点

Kotlin相关面试题_kotlin面试题-程序员宅基地

文章浏览阅读1.9w次,点赞26次,收藏185次。目录一.请简述下什么是kotlin?它有什么特性?二.Kotlin 中注解 @JvmOverloads 的作用?三.Kotlin中的MutableList与List有什么区别?四.kotlin实现单例的几种方式?五. kotlin中关键字data的理解?相对于普通的类有哪些特点?六.什么是委托属性?简单说一下应用场景?七.kotlin中with、run、apply、let函数的区别?一般用于什么场景?八.kotlin中Unit的应用以及和Java中void的区别?九.Ko_kotlin面试题

HEVC英文缩写及部分概念整理(1)--博主整理_反量化 英文缩写-程序员宅基地

文章浏览阅读2.8k次。有这个想法一方面是确实很多时候会记不得一些缩写是什么意思。另外也是受 http://blog.csdn.net/lin453701006/article/details/52797415这篇博客的启发,本文主要用于自己记忆 内容主要整理自http://blog.sina.com.cn/s/blog_520811730101hmj9.html http://blog.csdn.net/feix_反量化 英文缩写

超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门-程序员宅基地

文章浏览阅读7.3k次,点赞6次,收藏36次。超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门

python怎么输出logistic回归系数_python - Logistic回归scikit学习系数与统计模型的系数 - SO中文参考 - www.soinside.com...-程序员宅基地

文章浏览阅读1.2k次。您的代码存在一些问题。首先,您在此处显示的两个模型是not等效的:尽管您将scikit-learn LogisticRegression设置为fit_intercept=True(这是默认设置),但您并没有这样做statsmodels一;来自statsmodels docs:默认情况下不包括拦截器,用户应添加。参见statsmodels.tools.add_constant。另一个问题是,尽管您处..._sm fit(method

VS2017、VS2019配置SFML_vsllfqm-程序员宅基地

文章浏览阅读518次。一、sfml官网下载32位的版本 一样的设置,64位的版本我没有成功,用不了。二、三、四以下这些内容拷贝过去:sfml-graphics-d.libsfml-window-d.libsfml-system-d.libsfml-audio-d.lib..._vsllfqm

vc——类似与beyondcompare工具的文本比较算法源代码_byoned compare 字符串比较算法-程序员宅基地

文章浏览阅读2.7k次。由于工作需要,要做一个类似bc2的文本比较工具,用红色字体标明不同的地方,研究了半天,自己写了一个简易版的。文本比较的规则是1.先比较文本的行数,2.再比较对应行的字符串的长度3.再比较每一个字符串是否相同。具体代码如下:其中m_basestr和m_mergestr里面存放是待比较的字符串int basecount=m_basestr.GetLength(); int mergec_byoned compare 字符串比较算法