首页 > 编程语言 >Python实现 时域和频域 数值演变——blog7

Python实现 时域和频域 数值演变——blog7

时间:2024-04-08 16:32:37浏览次数:25  
标签:plt pulse Python fft blog7 数值 信号 np 时域

数值演变是指在一定时间段内,数值发生变化或发展的过程。在数值演变过程中,数值可以增加、减少、保持稳定,甚至发生剧烈波动。

数值演变可以应用于各个领域,例如经济学、生态学、物理学等。在经济学中,数值演变可以描述经济指标(如GDP、通货膨胀率、失业率等)的变化情况,帮助分析经济发展趋势和预测未来发展的可能性。在生态学中,数值演变可以描述种群数量的变化,帮助评估生态系统的稳定性和种群的生存状况。在物理学中,数值演变可以描述物理量随时间的变化,例如速度、温度、压力等。

数值演变的定义通常包括以下几个要素:起始状态(初始数值),演变规律(数值的变化模式或方程),演变时间(演变过程的时间段),以及终止状态(演变结束时的数值)。通过对这些要素的分析和计算,可以预测或模拟数值演变的过程和结果。

研究方法主要包括数学建模和计算机模拟:

1.数学建模可以通过建立数学方程或模型,来描述数值的演变规律。

2.计算机模拟则是利用计算机程序模拟数值的演变过程,并根据初始状态和演变规律,计算出演变的结果。

比如生成一段时域信号:

import numpy as np
import matplotlib.pyplot as plt

# 生成时间序列
t = np.linspace(0, 2*np.pi, 1000)

# 生成时域信号
x = np.sin(2*np.pi*3*t) + 0.5*np.sin(2*np.pi*7*t)

# 绘制时域信号
plt.plot(t, x)
plt.xlabel('时间')
plt.ylabel('振幅')
plt.title('时域信号')
plt.grid(True)
plt.show()

差不多的流程也可以得到一幅频域信号图像:

import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 1000)  # 时间范围从0到1,共生成1000个点
f = 10  # 正弦信号的频率
signal = np.sin(2*np.pi*f*t)  # 信号函数为sin(2*pi*f*t)
signal_freq = np.fft.fft(signal)  # 对信号进行快速傅里叶变换
freq = np.fft.fftfreq(len(signal), t[1]-t[0])  # 计算频率向量
plt.plot(freq, np.abs(signal_freq))  # 绘制频域信号的幅度谱
plt.xlabel('Frequency')
plt.ylabel('Amplitude')
plt.show()

显而易见的是:时域关注信号在时间上的变化,而频域关注信号在频率上的分布。

那么由此可以总结出数值演变的步骤。

时域数值演变原理及流程:

  1. 时域数值演变原理:时域数值演变是通过将连续信号离散化为一系列离散点,然后通过数值计算方法来推导出每个离散点的数值。在时域上,信号可以表示为一个时间序列,每个时间点都有相应的数值。

  2. 时域数值演变流程: a. 确定信号的采样率和采样时长。采样率表示每秒取样的次数,采样时长表示所要观察的时间段。 b. 根据采样率和采样时长,将连续信号离散化为一系列离散点。离散点的间隔由采样率决定。 c. 利用数值计算方法对每个离散点进行计算,得到对应的数值。常见的数值计算方法包括差分方程,欧拉法、龙格-库塔法等。 d. 重复上述计算步骤,直到计算到所需的时间点为止。

频域数值演变原理及流程:

  1. 频域数值演变原理:频域数值演变是通过对信号进行傅里叶变换,将信号从时域转换为频域,然后在频域上进行数值计算来推导出每个频率分量的数值。

  2. 频域数值演变流程: a. 对时域信号进行傅里叶变换,将信号从时域转换为频域。傅里叶变换可以通过离散傅里叶变换(DFT)或者快速傅里叶变换(FFT)算法来实现。 b. 在频域上进行数值计算。可以对频域信号进行滤波、频率分析、频率合成等操作,得到所需的结果。 c. 如果需要,可以将频域信号进行逆傅里叶变换,将信号从频域转换回时域。

以下是一段时域上方波数值演变示例:

import numpy as np
import matplotlib.pyplot as plt


#设计方波信号
#duty_cycle占空比选择0.5,amplitude方波幅度选择1,frequency频率,选择1
def square_wave(t, duty_cycle=0.5, amplitude=1, frequency=1):

    period = 1/frequency
    t_in_period = t % period
    wave = np.zeros_like(t)
    wave[t_in_period < duty_cycle*period] = amplitude
    wave[t_in_period >= duty_cycle*period] = -amplitude
    return wave


#编写坤分器程序
def integrator(x):
    y = np.zeros_like(x)
    for i in range(1, len(x)):
        y[i] = y[i-1] + x[i-1]*(t[i]-t[i-1])
    return y


#定义正脉冲
def positive_pulse(t, delay_time=0, pulse_width=0.1, amplitude=1):
    pulse = np.zeros_like(t)
    pulse[(t >= delay_time) & (t < delay_time+pulse_width)] = amplitude/pulse_width
    return pulse


#定义负脉冲
def negative_pulse(t, delay_time=0, pulse_width=0.1, amplitude=-1):
    pulse = np.zeros_like(t)
    pulse[(t >= delay_time) & (t < delay_time+pulse_width)] = amplitude/pulse_width
    return pulse


frequency = 2
duty_cycle = 0.4
pulse_width = 0.3
T = 10/frequency   # 设置模拟时长
N = 10000          # 设置采样点数

t = np.linspace(0, T, N, endpoint=False)  # 时间序列
x1 = square_wave(t, duty_cycle=duty_cycle, frequency=frequency) # 产生方波信号
y1 = integrator(x1)  # 对方波信号进行积分
y2 = positive_pulse(t, delay_time=T/2-pulse_width, pulse_width=pulse_width)  # 产生正半轴矩形脉冲
y3 = negative_pulse(t, delay_time=T/2, pulse_width=pulse_width)  # 产生负半轴矩形脉冲
y4 = y1*y2 + y3  # 信号转换

freqs = np.fft.fftfreq(N, T/N)   # 计算频率轴

fft_result_1 = np.fft.fft(y1)/N      # 进行FFT变换,归一化处理
amplitudes_1 = 2 * fft_result_1[:N//2]  # 获取振幅信息(仅需使用正半轴数据)

fft_result_2 = np.fft.fft(y2)/N      # 进行FFT变换,归一化处理
amplitudes_2 = 2 * fft_result_2[:N//2]  # 获取振幅信息(仅需使用正半轴数据)

fft_result_3 = np.fft.fft(y3)/N      # 进行FFT变换,归一化处理
amplitudes_3 = 2 * fft_result_3[:N//2] # 获取振幅信息(仅需使用正半轴数据)

fft_result_4 = np.fft.fft(y4)/N      # 进行FFT变换,归一化处理
amplitudes_4 = 2 * fft_result_4[:N//2]  # 获取振幅信息(仅需使用正半轴数据)



'''
timestep = 0.01   # 时间间隔
T = 5             # 周期长度
N = int(T/timestep)  # 样本点数
freqs = np.fft.fftfreq(N, timestep)   # 计算频率轴
fft_result = np.fft.fft(signal)/N      # 进行FFT变换,归一化处理
amplitudes = 2*np.abs(fft_result[:N//2])  # 获取振幅信息(仅需使用正半轴数据)
'''
# 绘图显示

plt.figure(figsize=(8, 6))
plt.plot(t, y1, label='square wave')
plt.plot(t, y2, '--', label='positive pulse')
plt.plot(t, y3, '-.', label='negative pulse')
plt.plot(t, y4, ':',label='transformed signal')
plt.xlabel('time (s)')
plt.ylabel('signal amplitude')
plt.grid()
plt.legend()
plt.show()

plt.subplot(411)
plt.plot(freqs[:N//2], amplitudes_1)

plt.subplot(412)
plt.plot(freqs[:N//2], amplitudes_2)

plt.subplot(413)
plt.plot(freqs[:N//2], amplitudes_3)

plt.subplot(414)
plt.plot(freqs[:N//2], amplitudes_4)

plt.show()

输出结果:

同样,我们可以将上述代码中生成的信号,通过傅立叶变换将信号从时域转换为频域,然后在频域上进行数值计算来推导出每个频率分量的数值,这次以正弦信号和高斯白噪声为例:

import numpy as np
import matplotlib.pyplot as plt


timestep = 0.01   # 时间间隔
T = 5             # 周期长度
N = int(T/timestep)  # 样本点数

# 生成正弦信号和高斯白噪声
t = np.linspace(0, T, N, endpoint=False)
f = 1/T
signal = np.sin(2*np.pi*f*t) + np.random.normal(loc=0, scale=0.3, size=N)  # 加入高斯白噪声

'''
plt.subplot(311)
plt.title("original graph")
plt.plot(signal)
'''

freqs = np.fft.fftfreq(N, timestep)   # 计算频率轴
fft_result = np.fft.fft(signal)/N      # 进行FFT变换,归一化处理
amplitudes = 2*np.abs(fft_result[:N//2])  # 获取振幅信息(仅需使用正半轴数据)

fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(8,6))
fig.subplots_adjust(hspace=0.5)   # 调整子图之间的间距

# 画出原始信号
ax1.plot(t, signal)
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('Amplitude')
ax1.set_title('Signal in Time Domain')

# 画出频谱分析结果
ax2.plot(freqs[:N//2], amplitudes)
ax2.set_xlabel('Freq (Hz)')
ax2.set_ylabel('Amplitude')
ax2.set_title('Signal in Frequency Domain')

plt.show()

对于一个正弦信号,频谱将显示在一个狭窄的频率范围内有一个峰值,表示信号的主频率,同时在主频率附近还会有一些较低的幅度的谐波:

当正弦信号的频率不断增加时,频谱中的主频率也会相应增加,并且主频率的幅度会逐渐增大。同时,谐波的频率也会随之增加,但幅度会逐渐减小。这意味着随着频率的增加,正弦信号在高频部分上的能量会逐渐增强,而低频部分的能量会逐渐减弱;

反之,当正弦信号的频率不断减小时,频谱中的主频率也会相应减小,并且主频率的幅度会逐渐减小。谐波的频率会随之减小,但幅度会逐渐增加。这意味着随着频率的减小,正弦信号在低频部分上的能量会逐渐增强,而高频部分的能量会逐渐减弱。

而高斯白噪声则表现为频谱均匀分布的情况,即各个频率上的信号强度相等。

时域和频域数值演变可以相互转换,通过傅里叶变换和逆傅里叶变换来完成。在实际应用中,选择使用时域还是频域数值演变取决于具体的问题和分析需求。

觉得有帮助的小伙伴可以点赞加个关注

后续会持续更新 免费、高质量 的高校大作业相关以及python学习文章

(拒绝AI水文章)

标签:plt,pulse,Python,fft,blog7,数值,信号,np,时域
From: https://blog.csdn.net/m0_66653437/article/details/137507810

相关文章

  • python WAV音频文件处理—— (1)读写WAV文件
    https://realpython.com/python-wav-files/#visualize-audio-samples-as-a-waveform了解WAV文件格式WAV是一种波形音频文件格式(WaveformAudioFileFormat)。虽然是一种古老的格式(九十年代初开发),但今天仍然可以看到这种文件。WAV具有简单、可移植、高保真等特点。WA......
  • Python学习笔记-001
    记录一下重学python,虽然python老早就接触了,更多的还是停留在语法层面,老c++了。最近打算从头开始系统拉一下python的基础,先预计8天学完。后面还打算系统学一下Numpy,Pandas和Matplotlib。python基础教程python简介检查是否安装python,终端输入python--versionpython是一种解释......
  • python data:image/jpeg;base64为网址的图片改如何下载
    网址以data开头的文件,这里采用base64进行编码。它叫做dataURI scheme,是一种网页优化的手段。让我们直接把图像的内容崁入网页里面,减少页面的请求data:表示协议image/jpg:数据类型编码方式:base64可以通过解码的方式下载图片importbase64defdownload_auth_img(self,im......
  • Github图床 Python Typora
    1.搭建Github图床1.1.创建或者选择一个Public仓库1.2.获取GithubToken2.Typora结合图床当Typora需要使用这个图床的时候,Picgo是很好的解决方案,但是还可以通过其他的方式来进行上传,比如python脚本。2.1.upload-img.pyimportrequestsimportbase64importj......
  • python进阶之tkinter模块
    tkinter 是Python的标准图形用户界面(GUI)工具包,用于创建桌面应用程序的用户界面。tkinter 提供了一组丰富的组件和工具,使开发者能够轻松地构建具有按钮、标签、文本框、滚动条等元素的交互式应用程序。以下是 tkinter 模块的一些主要作用:创建窗口:tkinter 提供了创建窗口......
  • python计算机毕设【附源码】基于Android开发的智能音乐播放系统(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着移动互联网的飞速发展,智能手机已经成为人们日常生活中不可或缺的一部分。在众多手机应用中,音乐播放系统是用户使用频率较高的应用之一。传统的音乐播放......
  • 文本转语音常用的几个python库
    在Python编程领域,文本到语音(Text-to-Speech,TTS)的转换是一个常见的需求,尤其是在开发能够与用户交互的应用程序时。以下是几个流行的Python库,它们可以帮助开发者实现文本到语音的转换,并且有的可以将转换后的语音保存为MP3文件。gTTS(GoogleText-to-Speech)gTTS是一个依......
  • 27岁自学Python转行靠谱吗?入行晚吗?
    今年已经奔三的小编来给大家说说,之前自己也是在一个普通的二本院校上学,学的还是工商管理,毕竟读书的时候电视剧里面的主角都是工商管理的大佬。不过在毕业之后就经历了社会的毒打,后面小编就想去换一个工作,学起了软件应用开发,然后这几年的数据分析很火又来试试,生命在于折腾......
  • 粉丝提问:26想转行做Python开发,是不是已经晚了?
    26岁基本上是一个硕士研究生刚毕业的年纪,相当于本科毕业工作了2年,总体来说时间耽误的并不算太多,想转行做Python开发,不算太晚!1转行前先想清楚这5点!①年龄:至少在35岁前还有9年时间,时间上面是可以的。②学历:有没有达到最低的学历要求?本科以下不好找。③风险:是否做好了......
  • 一起学习python——基础篇(7)
    今天讲一下python的函数。函数是什么?函数是一段独立的代码块,这块代码是为了实现一些功能,而这个代码块只有在被调用时才能运行。在Python中,使用 def关键字定义函数:函数的固定结构就是def(关键字)+函数名字(自己定义)+():deftest_function():#里面的内容一定要有空格(......