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

本文探讨了数值演变的基本概念,包括其在经济学、生态学和物理学中的应用,重点介绍了时域和频域的数值演变原理、流程以及示例,涉及数学建模、计算机模拟和傅里叶变换在信号处理中的运用。
摘要由CSDN通过智能技术生成

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

数值演变可以应用于各个领域,例如经济学、生态学、物理学等。在经济学中,数值演变可以描述经济指标(如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水文章)

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值