数值演变是指在一定时间段内,数值发生变化或发展的过程。在数值演变过程中,数值可以增加、减少、保持稳定,甚至发生剧烈波动。
数值演变可以应用于各个领域,例如经济学、生态学、物理学等。在经济学中,数值演变可以描述经济指标(如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()
显而易见的是:时域关注信号在时间上的变化,而频域关注信号在频率上的分布。
那么由此可以总结出数值演变的步骤。
时域数值演变原理及流程:
时域数值演变原理:时域数值演变是通过将连续信号离散化为一系列离散点,然后通过数值计算方法来推导出每个离散点的数值。在时域上,信号可以表示为一个时间序列,每个时间点都有相应的数值。
时域数值演变流程: a. 确定信号的采样率和采样时长。采样率表示每秒取样的次数,采样时长表示所要观察的时间段。 b. 根据采样率和采样时长,将连续信号离散化为一系列离散点。离散点的间隔由采样率决定。 c. 利用数值计算方法对每个离散点进行计算,得到对应的数值。常见的数值计算方法包括差分方程,欧拉法、龙格-库塔法等。 d. 重复上述计算步骤,直到计算到所需的时间点为止。
频域数值演变原理及流程:
频域数值演变原理:频域数值演变是通过对信号进行傅里叶变换,将信号从时域转换为频域,然后在频域上进行数值计算来推导出每个频率分量的数值。
频域数值演变流程: 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