python 处理锯齿波信号

预期学习目标(ILO):
您应该
了解傅里叶分析在时域中周期性信号的基础,即如何将周期性时域信号分解为基频。
能够从头编程周期波形,并将其与“scipy”版本进行比较。
使用离散傅里叶变换获得第一次经验。
了解Python库的基本用法

# Let's do the ususal necessary and nice-to-have imports
%matplotlib inline
import matplotlib.pyplot as plt  # plotting
import seaborn as sns; sns.set() # styling (uncomment if you want)
import numpy as np               # math

频率分析(周期信号)
傅里叶定理指出,任何频率为f0的周期信号都可以通过将频率为f0,2f0,3f0,4f0,5f0等的“正弦波”(正弦波)相加而精确地构建。将周期时域信号分割为正弦波称为傅里叶分析。
“傅里叶级数”中的每个正弦曲线的特征在于频率振幅,以及阶段
f0被称为基频。2f0、3f0、4f0等被称为谐波。

任务1:生成锯齿波信号
最简单形式的锯齿波信号定义为Xsaw(t)=t−⌊t⌋
下面的代码使用scipy中的锯齿()生成了频率为f=200 Hz的锯齿信号,持续时间为2秒。

from scipy import signal as sig     # for easy sawtooth signal generation
from IPython import display as ipd  # to playback audio signalsfs=8000                   # sampling frequency
t = np.arange(0, 2, 1/fs) # time vectorf = 200                   # frequency in Hz for scipy sawtooth
saw_tooth = sig.sawtooth(2 * np.pi * f * t)# plot first 20 ms (=160 samples at sampling frequency of 8000 Hz)
plt.subplot(1,2,1)
plt.plot(t[0:160], saw_tooth[0:160], '--', label='scipy sawtooth');
plt.xlabel('time $t$ in seconds'); plt.ylabel('$x(t)$')
plt.legend();# calculate the spectum (frequency domain representation)
FFT_length = 2**15 # take a power of two which is larger than the signal length
f = np.linspace(0, fs/2, num=int(FFT_length/2+1))
spectrum = np.abs(np.fft.rfft(saw_tooth,n=FFT_length))# plot the spectrum
plt.subplot(1,2,2)
plt.plot(f,spectrum)
plt.xlabel('frequency $f$ in Hz')
plt.ylabel('$x(f)$')plt.tight_layout() # this allowes for some space for the title text.# playback sound file (if you want)
ipd.Audio(saw_tooth, rate=fs)

在np.fft中,有fft和rfft可以选择。如果样本数据的总数量为N,fft函数返回N个变换后的数据,但是这N个数据是左右对称的,即有效的实际数据只有N/2+1个。而rfft直接只返回N/2+1个数据,可以不用处理直接使用。

  • saw_tooth = sig.sawtooth(2 * np.pi * f * t)?
  • t[0:160] dos the 160 means 160 seconds?

当查看上图右面板中的频谱时,我们看到它是由等距离谱线组成的,对于更高的频率具有衰减幅度。

任务2: 锯齿波信号的傅里叶级数
从FourierSeriesSawtoothSimple生成前四个正弦波,并显示这些正弦波的叠加会产生锯齿波信号。对于简单的可视化,您可以选择fs=8000 Hz,f0=2 Hz,时间向量t的长度为2秒。但可以随意使用这些值。
提示:最好将锯齿波生成作为一个函数来实现,例如使用以下界面:generateSawTooth(f0=1,length=2,fs=8000,order=10)
正弦(和余弦)振荡可以被视为从卡地斯坐标系中心到单位圆的向量投影,在单位圆上移动到x轴和y轴。
如果我们在第一个正弦的顶部加上第二个正弦(这里是双频(2ω0),但振幅的一半),即要实现sin(ω0t)+0.5sin(2Ω0t),这可以解释为从单位圆上的当前值(下图左面板中的绿点)开始向半径为一半的第二个圆添加另一个矢量(振幅因子0.5)。该信号已经变得“有点锯齿状”。右面板显示了频谱内容,即在各个正弦信号的频率下的两条谱线。

fs=8000 # sampling frequencyt=np.arange(0,2,1/fs) # time vector
f0=2                  # fundamental frequency in Hzsin1=np.sin(2*np.pi*f0*t)
sin2=np.sin(2*np.pi*2*f0*t)/2
sin3=np.sin(2*np.pi*3*f0*t)/3
sin4=np.sin(2*np.pi*4*f0*t)/4plt.figure(figsize=(8, 6))plt.subplot(4,2,1)
plt.plot(t,sin1,label='$\mathrm{sin}(\omega_0 t$)')
plt.ylabel('$x_1(t)$')
plt.legend()plt.subplot(4,2,3)
plt.plot(t,sin2,label='$\mathrm{sin}(2 \omega_0 t$)/2')
plt.ylabel('$x_2(t)$')
plt.legend()plt.subplot(4,2,4)
plt.plot(t,sin1+sin2,label='$x_1(t)+x_2(t)$')
plt.legend()plt.subplot(4,2,5)
plt.plot(t,sin3,label='$\mathrm{sin}(3 \omega_0 t$)/3')
plt.ylabel('$x_3(t)$')
plt.legend()plt.subplot(4,2,6)
plt.plot(t,sin1+sin2+sin3,label='$x_1(t)+x_2(t)+x_3(t)$')
plt.legend()plt.subplot(4,2,7)
plt.plot(t,sin4,label='$\mathrm{sin}(4 \omega_0 t$)/4')
plt.ylabel('$x_4(t)$')
plt.xlabel('time $t$ in seconds')
plt.legend()plt.subplot(4,2,8)
plt.plot(t,sin1+sin2+sin3+sin4,label='$x_1(t)+x_2(t)+x_3(t)+x_4(t)$')
plt.xlabel('time $t$ in seconds')
plt.legend()plt.tight_layout() # this allowes for some space for the title text.
None               # this suppresses text output in the Jupyter Notebook

请注意,左侧面板中的正弦曲线振幅减小(参见y轴标签)。
作为函数的实现(下面的generateSawTooth())当然在代码重用性方面更有效:

def generateSawTooth(f0=1, length = 2, fs=8000, order=10, height=1):"""Return a saw-tooth signal with given parameters.Parameters----------f0 : float, optionalfundamental frequency $f_0$ of the signal to be generated,default: 1 Hzlength : float, optionallength of the signal to be generated, default: 2 sec.fs : float, optionalsampling frequency $f_s$, default: 8000 Hzorder : int, optionalnumber of sinosuids to approximate saw-tooth, default: 10height : float, optionalheight of saw-tooth, default: 1Returns-------sawToothgenerated sawtooth signaltmatching time vector"""t=np.arange(0,length,1/fs) # time vectorsum = np.zeros(len(t))for ii in range(1,order+1):sum += np.sin(2*np.pi*ii*f0*t)/iireturn 2*height*sum/np.pi, t# generate a sawtooth signal composed of 10 sinusoids
f0 = 2 # signal frequency in Hz
saw,t = generateSawTooth(f0=f0,order=10)
plt.subplot(2,1,1)
plt.plot(t,saw)
plt.xlabel('time $t$ in seconds');
plt.title('Saw-tooth signal generated from 10 sinusoids')# generate a sawtooth signal composed of 100 sinusoids
saw,t = generateSawTooth(f0=f0,order=100)
plt.subplot(2,1,2)
plt.plot(t,saw,label='sawtooth Fourier')
plt.xlabel('time $t$ in seconds');
plt.title('Saw-tooth signal generated from 100 sinusoids')# compare to the sawtooth signal generated by scipy
# the multiplication with -1 just flips the sawtooth to plot it
# fitting to what we just generated
saw_scipy = -1 * sig.sawtooth(2 * np.pi * f0 * t)plt.plot(t, saw_scipy, '--', label='scipy sawtooth');
plt.legend();plt.tight_layout() # this allowes for some space for the title text.
  • saw,t = generateSawTooth(f0=f0,order=10)?
    在下面板中,使用scipy的sawtooth()函数生成的波形。信号库进行了对比,以明确您可以使用scipy.signal.sawtooth()(更好地理解)编程。

任务4:矩形傅里叶级数 /矩形波

def generateSquare(f0=1, length = 2, fs=8000, order=10):t=np.arange(0,length,1/fs)  # time vectorsum = np.zeros(len(t)) # pre-allocate variable with zeros for ii in range(1, order+1, 2):sum += np.sin(2*np.pi*ii*f0*t)/ii#print(str(ii)+': adding sin(2 $\pi$ '+str(ii*f0)+' Hz t)')return 4/np.pi*sum, t# let's use the function and generate and plot a square wave form
f0=1 # desired frequency in Hz
rec,t = generateSquare(f0,order=20)
plt.plot(t,rec,label='square Fourier');
plt.ylabel('rectangular signal $x_{\mathrm{rect}}(t)$')
plt.xlabel('time $t$ in seconds');# compare to the rectangular/square wave signal generated by scipy
rec_scipy = sig.square(2 * np.pi * f0 * t)
plt.plot(t,rec_scipy,'--',label='scipy square wave')
plt.legend();

python 处理锯齿波信号相关推荐

  1. 基本的信号——三角脉冲信号(非周期锯齿波信号)

    其matlab代码如下: %单个三角脉冲信号(非周期锯齿波信号) t=-3:0.001:3; %定义时间变量 width=4; %定义三角波信号的宽度 A_x=0.5; %定义三角波信号最高点所对应的 ...

  2. python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

    如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题: 示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush ...

  3. matlab2014 锯齿波,matlab周期锯齿波

    (:,1:halft)); 1.5 1 0.5 0 15 10 4 3 5 2 1 00 MATLAB在信号与系统课程中的应用 EE of BUPT 例7-2 求周期锯齿波的三角函数形式的傅里叶级数. ...

  4. c51用汇编语言产生锯齿波,单片机产生四种波形并可任意切换的正弦波发生器汇编程序...

    ; Main.asm file generated by New Project wizard ; Created:   周五 5月 24 2019 ; Processor: AT89C52 ; Co ...

  5. matlab 锯齿波调频,锯齿波线性调频信号参数提取方法与流程

    本发明属于雷达信号处理技术领域,特别是一种锯齿波线性调频信号参数提取方法. 背景技术: 侦察过程中,为提高测距精度和距离分辨力,信号必须有大的带宽:为提高测速精度和速度分辨率,信号又必须有大的时宽.由 ...

  6. python正弦波和等腰三角波_51proteus仿真:生成方波、正弦波、锯齿波和三角波

    51proteus仿真:生成方波.正弦波.锯齿波和三角波 这个proteus仿真是一个网友做的,该仿真可以生成方波.正弦波.锯齿波和三角波,并且还可以用按键调整波形. 不过,对初学者来讲,可能有点复杂 ...

  7. Python分析离散心率信号(上)

    Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...

  8. 自适应小波阈值去噪python_基于python的小波阈值去噪算法

    小波图像去噪原理 图像和噪声在经小波变换后具有不同的统计特性:图像本身的能量对应着幅值较大的小波系数,主要集中在低频(LL)部分:噪声能量则对应着幅值较小的小波系数,并分散在小波变换后的所有系数中.基 ...

  9. MATLAB绘制正弦波、方波、三角波、锯齿波的mif文件

    MATLAB绘制正弦波.方波.三角波.锯齿波的mif文件 % 对波形进行等间隔采样,以采样次数作为 ROM 存储 % 地址,将采集的波形幅值数据做为存储数据写入存储地址对应的存储空间 % 采样次数为 ...

最新文章

  1. 消息称苹果正在组建新智能家居团队
  2. tensorflow 代码阅读
  3. android根据文件路径打开文件_你知道如何在打印的文件上面添加文件的路径吗...
  4. Nginx简介及使用Nginx实现负载均衡的原理【通俗易懂,言简意赅】
  5. 90后80后70后60后和50后的无奈
  6. @insert 对象_python中列表插入append(), extend(), insert()
  7. Spring 官宣,干掉原生 JVM!
  8. ASP连接各类数据库的语句
  9. 30秒清除你电脑中的垃圾
  10. Spring Boot单元测试入门实战之关于JUnit
  11. Android Track的play流程(三十二)
  12. 10款精选的后台管理系统,收藏吧!
  13. 织梦采集插件,无需采集规则,补损值
  14. 利用场景法设计atm自动取款机的测试用例_如何使用场景法设计测试用例
  15. win10wifi开关自动弹回_win10突然搜不到wifi了,这个开关点不动,点了会自动变回去...
  16. 微信内置浏览器是什么?
  17. Can‘t reconnect until invalid transaction is rolled back
  18. linux 编译器制作,Linux交叉編譯器的制作(一)
  19. java epics_Visual Paradigm敏捷开发教程(7):如何管理Epics
  20. 呵护眼睛,从小事做起

热门文章

  1. pdf java 开源_Java开源PDF类库 分类列表
  2. Linux之sudo自动输入密码
  3. 后端返回一个下载Excel表格的url,要PC浏览器打开下载,前端代码设计
  4. 手把手教你玩转android应用Microsoft Remote Desktop
  5. 狗年大作狗文化,吉祥送进千万家!丰收、兴旺、欢乐的景象。(图集)
  6. 几种查询局域网内在线弱电设备IP地址的方法,总有一款你会用的到
  7. 经销、代销与联营的区别与联系详解
  8. python仿360界面_python实现360的字符显示界面
  9. Windows 10 20H1 2004新功能
  10. 7.2 MVC 实现登录验证