信号与系统学习:傅里叶级数

一、基本概念

1. 什么是傅里叶级数?

傅里叶级数是一种数学工具,可以将一个周期函数分解为一系列正弦和余弦函数(即三角函数)的和。这些正弦和余弦函数的频率是原函数的整数倍

2. 为什么要使用傅里叶级数?

  • 信号分析:将复杂的周期信号分解为简单的正弦和余弦分量,便于分析和处理。
  • 工程应用:在通信、电子、振动分析等领域,用于信号处理、滤波、频谱分析等。

二、周期信号的分解

1. 周期函数的定义

一个函数 f(t) 如果满足:,对于所有的 t,其中 T 是周期,那么 f(t) 就是周期函数

2. 傅里叶级数的表达式

对于周期为 T 的函数 f(t),它可以表示为:

  • ω0=2π/T 是基频角速度
  • a0,an,bn 是傅里叶系数,需要通过积分计算得到

3. 傅里叶系数的计算

(1) 直流分量(平均值) a0
                ​​​​​​​        ​​​​​​​        ​​​​​​​        
(2) 余弦系数 an
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        
(3) 正弦系数 bn
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

三、奇偶函数的傅里叶级数

1. 偶函数的傅里叶级数

如果函数 f(t) 是偶函数,即满足 f(−t)=f(t),则:

  • 所有的正弦系数 bn=0
  • 傅里叶级数只包含余弦项

表达式:

2. 奇函数的傅里叶级数

如果函数 f(t) 是奇函数,即满足 f(−t)=−f(t),则:

  • 所有的余弦系数 an=0
  • 傅里叶级数只包含正弦项

表达式:

四、傅里叶级数的指数形式

1. 欧拉公式

欧拉公式将指数函数与三角函数联系起来:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        

2. 指数形式的傅里叶级数

利用欧拉公式,傅里叶级数可以表示为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        
 

Cn 是复数形式的傅里叶系数
3. 傅里叶系数 Cn 的计算

                                

实际上,三角形式和指数形式的傅里叶级数是等价的

五、实例解析

例子:周期方波的傅里叶级数展开

1. 定义方波函数

设周期为 T,幅值为 A 的方波 f(t):

  • 在 0<t<T/2 时,f(t)=A
  • 在 −T/2<t<0 时,f(t)=−A
  • 这是一个奇函数
2. 计算傅里叶系数

(1) 由于 f(t) 是奇函数,所有 an=0

(2) 计算正弦系数 bn

 利用对称性和三角函数的性质,经过计算可得:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

注意到:

  • 当 n 为奇数时,sin⁡(nπ/2)=±1
  • 当 n 为偶数时,sin⁡(nπ/2)=0

因此:

  • 当 n 为奇数时

  • 当 n 为偶数时:bn=0

3. 得到傅里叶级数表达式:
                                

六、代码辅助理解

这里为了更直观地理解傅里叶级数如何逼近原始信号
代码1:绘制原始方波和其傅里叶级数的近似

import numpy as np
import matplotlib.pyplot as plt

# 定义参数
A = 1          # 方波幅值
T = 2 * np.pi  # 周期
omega0 = 2 * np.pi / T  # 基频
t = np.linspace(-T, T, 1000)  # 时间轴

# 定义原始方波函数
def square_wave(t):
    return A * np.sign(np.sin(omega0 * t))

# 计算傅里叶级数近似
def fourier_series(t, N):
    f = np.zeros_like(t)
    for n in range(1, N + 1, 2):  # 只取奇数项
        bn = (4 * A) / (n * np.pi)
        f += bn * np.sin(n * omega0 * t)
    return f

# 绘制原始方波
plt.figure(figsize=(12, 6))
plt.plot(t, square_wave(t), label='原始方波', linewidth=2)

# 绘制傅里叶级数近似
N_terms = [1, 3, 5, 9, 19]  # 不同项数的近似
for N in N_terms:
    f_approx = fourier_series(t, N)
    plt.plot(t, f_approx, label=f'傅里叶级数近似 (前 {N} 项)')

plt.title('方波的傅里叶级数近似')
plt.xlabel('时间 t')
plt.ylabel('幅值')
plt.legend()
plt.grid(True)
plt.show()

代码解释:

  • square_wave(t):定义了原始方波函数
  • fourier_series(t, N):计算傅里叶级数的前 N 项近似
  • N_terms:选择不同的项数来观察傅里叶级数的逼近效果

运行结果:

  • 当 N 较小时,傅里叶级数的近似效果不佳,出现明显的波动(吉布斯现象)
  • 随着 N 的增加,傅里叶级数对方波的逼近越来越精确

 

如右上角图例:蓝色的是源波形,下面的即是随着级数增加逐渐逼近

代码2:傅里叶级数分解锯齿波:

import numpy as np
import matplotlib.pyplot as plt

# 定义参数
A = 1          # 锯齿波幅值
T = 2 * np.pi  # 周期
omega0 = 2 * np.pi / T  # 基频
t = np.linspace(-T, T, 1000)  # 时间轴

# 定义原始锯齿波函数
def sawtooth_wave(t):
    return 2 * A * (t / T - np.floor(t / T + 0.5))

# 计算傅里叶级数近似
def fourier_series(t, N):
    f = np.zeros_like(t)
    for n in range(1, N + 1):
        bn = (-2 * A) / (n * np.pi) * ((-1)**n)
        f += bn * np.sin(n * omega0 * t)
    return f

# 绘制原始锯齿波
plt.figure(figsize=(12, 6))
plt.plot(t, sawtooth_wave(t), label='原始锯齿波', linewidth=2)

# 绘制傅里叶级数近似
N_terms = [1, 5, 10, 20, 50]  # 不同项数的近似
for N in N_terms:
    f_approx = fourier_series(t, N)
    plt.plot(t, f_approx, label=f'傅里叶级数近似 (前 {N} 项)')

plt.title('锯齿波的傅里叶级数近似')
plt.xlabel('时间 t')
plt.ylabel('幅值')
plt.legend()
plt.grid(True)
plt.show()

代码解释:

  • sawtooth_wave(t):定义了一个锯齿波,它比方波复杂得多,包含更多的频率分量
  • fourier_series(t, N):计算傅里叶级数的前 N 项近似,这次我们没有限制为奇数项,包含了所有频率分量
  • N_terms:从 1 项增加到 50 项,通过不同的傅里叶级数项数来逼近原始锯齿波

运行结果:
随着傅里叶级数的项数增加,锯齿波的傅里叶级数逐渐从简单的正弦波逼近一个复杂的锯齿形状。特别是,当项数达到较高值时(如 50 项),傅里叶级数几乎完全重构了锯齿波

这里应该就能感受到傅里叶级数将一个复杂信号分解为简单的正弦分量后,再通过这些分量逐步还原原始信号的过程了。傅里叶级数的魅力在于,无论信号多么复杂,它都可以被分解为不同频率的正弦波,且通过增加高频项的数量,可以逐渐还原信号的原始形态

代码3:叠加信号的傅里叶级数

import numpy as np
import matplotlib.pyplot as plt

# 定义参数
A1, A2, A3 = 1, 0.5, 0.75  # 锯齿波、三角波、方波的幅值
T = 2 * np.pi  # 周期
omega0 = 2 * np.pi / T  # 基频
t = np.linspace(-T, T, 1000)  # 时间轴

# 定义原始信号:锯齿波、三角波、方波叠加
def complex_wave(t):
    sawtooth = 2 * A1 * (t / T - np.floor(t / T + 0.5))  # 锯齿波
    triangle = A2 * (8 / np.pi**2) * np.sum([((-1)**n) * np.cos((2*n+1) * omega0 * t) / (2*n+1)**2 for n in range(20)], axis=0)  # 三角波
    square = A3 * np.sign(np.sin(omega0 * t))  # 方波
    return sawtooth + triangle + square  # 叠加成复杂信号

# 计算傅里叶级数近似
def fourier_series(t, N):
    f = np.zeros_like(t)
    for n in range(1, N + 1):
        # 锯齿波的傅里叶系数
        bn_sawtooth = (-2 * A1) / (n * np.pi) * ((-1)**n)
        f += bn_sawtooth * np.sin(n * omega0 * t)
        
        # 三角波的傅里叶系数
        if n % 2 != 0:  # 只有奇数项有非零系数
            bn_triangle = (8 * A2) / (n**2 * np.pi**2)
            f += bn_triangle * np.sin(n * omega0 * t)
        
        # 方波的傅里叶系数
        if n % 2 != 0:  # 只有奇数项有非零系数
            bn_square = (4 * A3) / (n * np.pi)
            f += bn_square * np.sin(n * omega0 * t)
            
    return f

# 绘制原始复杂信号
plt.figure(figsize=(12, 6))
plt.plot(t, complex_wave(t), label='原始复杂信号', linewidth=2)

# 绘制傅里叶级数近似
N_terms = [1, 5, 10, 20, 50]  # 不同项数的近似
for N in N_terms:
    f_approx = fourier_series(t, N)
    plt.plot(t, f_approx, label=f'傅里叶级数近似 (前 {N} 项)')

plt.title('复杂信号的傅里叶级数近似')
plt.xlabel('时间 t')
plt.ylabel('幅值')
plt.legend()
plt.grid(True)
plt.show()

解释:

  • complex_wave(t):这是一个更加复杂的周期信号,由锯齿波、三角波和方波叠加而成。每个波形的幅值不同。
  • fourier_series(t, N):计算傅里叶级数的前 N 项近似。它分别为锯齿波、三角波和方波计算傅里叶系数,并叠加它们的贡献。
  • N_terms:通过不同的傅里叶级数项数来逼近原始复杂信号

运行结果:

  • 当 N=1 时,傅里叶级数只是一个简单的正弦波,无法很好地还原复杂的信号
  • 随着 N 的增加(如 N=50),傅里叶级数能够逼近更复杂的信号形状

 

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

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

相关文章

J2学习打卡

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 ResNet50V2 import torch import torch.nn as nn import torch.nn.functional as Fclass Bottleneck(nn.Module):expansion 4def __init__(self, inplanes,…

软考(中级-软件设计师)计算机系统篇(1024)

#1024程序员节|正文# 六、树和二叉树 6.1 树的基本概念 描述结果结点的度子结点的个数树的度最大结点的度叶子结点没有子结点的结点内部结点除根结点和叶子结点外的结点父节点有子结点的结点子节点有父结点的结点兄弟节点有同一个父结点的结点层次4层 6.2 二叉树的基本概念…

AI时代LabVIEW程序员的未来出路

随着GPT等AI技术的迅速发展&#xff0c;AI已经能够自动完成大量的代码生成工作&#xff0c;这无疑给LabVIEW程序员带来了新的挑战和机遇。尽管AI能够替代部分编程工作&#xff0c;LabVIEW程序员依然可以通过以下几方面找到出路&#xff1a; 复杂系统集成&#xff1a; AI可以帮助…

【软考高级架构】关于分布式数据库缓存redis的知识要点汇总

一.分布式数据库的含义 分布式数据库缓存指的是在高并发的环境下&#xff0c;为了减轻数据库的压力和提高系统响应时间&#xff0c;在数据库系统和应用系统之间增加一个独立缓存系统。 二.常见的缓存技术 &#xff08;1&#xff09;MemCache: Memcache是一个高性能的分布式的内…

你对MySQL的having关键字了解多少?

在MySQL中&#xff0c;HAVING子句用于在数据分组并计算聚合函数之后&#xff0c;对结果进行进一步的过滤。它通常与GROUP BY子句一起使用&#xff0c;以根据指定的条件过滤分组。HAVING子句的作用类似于WHERE子句&#xff0c;但WHERE子句是在数据被聚合之前进行过滤&#xff0c…

闯关leetcode——205. Isomorphic Strings

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/isomorphic-strings/ 内容 Given two strings s and t, determine if they are isomorphic. Two strings s and t are isomorphic if the characters in s can be replaced to get t. All occur…

2021亚洲机器学习会议:面向单阶段跨域检测的域自适应YOLO(ACML2021)

原文标题&#xff1a;Domain Adaptive YOLO for One-Stage Cross-Domain Detection 中文标题&#xff1a;面向单阶段跨域检测的域自适应YOLO 1、Abstract 域转移是目标检测器在实际应用中推广的主要挑战。两级检测器的域自适应新兴技术有助于解决这个问题。然而&#xff0c;两级…

现场总是发生急停,很可能是PLC和设置间网络中断

如果你的现场总是发生急停&#xff0c;很可能是PLC和设置间网络中断&#xff0c;本文用一个真实案例告诉你问题背后的原因和解决方法&#xff01; 这是一台生产汽车配件的机器&#xff0c;使用1500F的控制器连接机器人控制器&#xff0c;现场装置总会莫名其妙的发生急停故障。…

部署前后端分离若依项目--CentOS7Docker版

一、准备 centos7虚拟机或服务器一台 若依前后端分离项目&#xff1a;可在下面拉取 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、环…

JavaEE进阶----19.<Mybatis进阶(动态SQL)>

详解动态SQL <if>标签、<trim>标签、<where>标签、<set>标签、<foreach>标签、<include>标签 & <SQL>标签 MySQL&#xff08;进阶&#xff09; 一、动态SQL 也就是SQL语句中指定的属性&#xff0c;若我们不想输入进行查询&…

查缺补漏----分组交换所需时间计算

总结以及图片来源&#xff1a;b站湖科大真题计网讲解 对于报文交换&#xff0c;路由器完整接收整个报文后&#xff0c;才能对报文进行转发。对于分组交换&#xff0c;则是将报文划为更小的分组进行传送&#xff0c;路由器边接收分组边转发分组。 报文交换&#xff1a; 分组交换…

文件上传漏洞及安全

文件上传 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题&#xff0c;对于如何确保这类安全问题&#xff0c;一般会从原生态功能中的文件内容&#xff0c;文件后缀&#xff0c;文件类型等方面判断&#xff0c;但是漏洞可能不仅在本身的代码…

Java的查找算法和排序算法

Java的查找算法和排序算法 一、查找算法1. 基本查找a. 示例 2. 二分查找a. 示例 3. 插值查找4. 斐波那契查找5. 分块查找a. 示例 二、排序算法1. 冒泡排序a. 示例 2. 选择排序a. 示例 3、插入排序a. 示例 4. 快速排序&#xff08;效率最高&#xff09;a. 示例 一、查找算法 1.…

期权懂|2024年期权最新止损策略有哪些?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;2024年期权最新止损策略有哪些&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 2024年期权最新止损策略有哪些&#xff1f; 一、浮亏比例…

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数&#xff0c;用于绘制数据框中的数据。它是基于 Matplotlib 库构建的&#xff0c;可以轻松地创建各种类型的图表&#xff0c;包括折线图、柱状图、散点…

PCM5102A具有PLL和32位、384kHz PCM/I2S接口的2.1VRMS、112dB音频立体声DAC

PCM5102A外观和丝印 1 特性 1•超低带外噪声 •具有BCK基准的高性能集成音频锁相环(PLL)&#xff0c;可在内部生成SCK •直接线路电平2.1VRMS输出 •无需隔直电容 •线路电平输出支持低至1kΩ的负载 •智能静音系统&#xff1b;软斜升或斜降搭配模拟静音&#xff0c;实现120dB…

深度学习实战项目】基于OPenCV的人脸识别考勤系统软件开发【python源码+UI界面+功能源码详解】

背景及意义 人脸识别&#xff08;Face Recognition&#xff09;是基于人的脸部特征信息进行身份识别的一种生物识别技术&#xff0c;可以用来确认用户身份。本文详细介绍了人脸识别基本的实现原理&#xff0c;并且基于python与pyqt开发了人脸识别与信息管理软件&#xff0c;主要…

Go第三方框架--gorm框架(一)

前言 orm模型简介 orm模型全称是Object-Relational Mapping&#xff0c;即对象关系映射。其实就是在原生sql基础之上进行更高程度的封装。方便程序员采用面向对象的方式来操作数据库&#xff0c;将表映射成对象。 这种映射带来几个好处&#xff1a; 代码简洁&#xff1a;不用…

AVL树介绍与构建

目录 AVL树的概念 二叉树的构建 平衡因子的更新 旋转 左单旋 旋转过程 左单旋代码 右单旋 旋转过程 右单旋代码 左右双旋 发生情况 抽象图 具体图 平衡因子更新 左右双旋代码 右左双旋 右左双旋旋代码 验证测试AVL树 测试成员函数 测试代码 AVL树实现代码…

使用virtualenv导入ssl模块找不到指定的模块

最近在学习tensorflow&#xff0c;由于教程里面使用的是virtualenv&#xff0c;所以就按照教程开始安装了虚拟环境。但是在使用的时候&#xff0c;卡在了import ssl这一步&#xff0c;提示如下错误 >>> import ssl Traceback (most recent call last):File "<…