优化这段import numpy as np import matplotlib.pyplot as plt %config InlineBackend.figure_format='retina' # 输入信号 def inputVoltageSignal_func(t_vec, A, phi, noise, freq): Omega = 2np.pifreq return Anp.sin(Omegat_vec + phi) + noise * (2np.random.random(t_vec.size)-1) # 锁相测量部分 def LockinMeasurement_func(inputVoltageSignal, t_vec, ref_freq): # 生成参考信号 sin_ref = 2np.sin(2 * np.pi * ref_freq * t_vec) cos_ref = 2*np.cos(2 * np.pi * ref_freq * t_vec) # 混频信号 signal_0 = inputVoltageSignal * sin_ref signal_1 = inputVoltageSignal * cos_ref # 低通滤波 X = np.mean(signal_0) Y = np.mean(signal_1) # 计算振幅和相位 A = np.sqrt(X2 + Y2) phi = np.arctan2(Y, X) return A, phi # 参数 A = 1 phi = 0 noise = 1 ref_freq = 100 t_vec = np.linspace(0, 0.2, 1001) # 列表来保存幅值和相位数据 amplitude_list = [] phase_list = [] freq_list = np.arange(1, 1001) # 循环计算不同频率下的幅值和相位 for freq in freq_list: # 生成原始信号 Vin_vec = inputVoltageSignal_func(t_vec, A, phi, noise, freq=freq) # 锁相测量 A, phi = LockinMeasurement_func(Vin_vec, t_vec, ref_freq=freq) # 保存幅值和相位数据 amplitude_list.append(A) phase_list.append(phi) #绘图 # 幅值与频率的关系图 plt.figure(figsize=(10, 6)) plt.subplot(2,1,1) plt.plot(freq_list, amplitude_list) plt.xlabel('freq (Hz)') plt.ylabel('A') plt.title('relationship between A and freq') plt.show() # 相位与频率的关系图 plt.figure(figsize=(10, 6)) plt.subplot(2,1,2) plt.plot(freq_list, phase_list) plt.xlabel('freq (Hz)') plt.ylabel('Phi') plt.title('relationship between Phi and freq') plt.show()使用while循环
时间: 2024-04-16 18:24:17 浏览: 163
你可以将代码中的一些重复计算优化掉,并且使用一个 `while` 循环来计算不同频率下的幅值和相位。以下是优化后的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
%config InlineBackend.figure_format='retina'
# 输入信号
def inputVoltageSignal_func(t_vec, A, phi, noise, freq):
Omega = 2 * np.pi * freq
return A * np.sin(Omega * t_vec + phi) + noise * (2 * np.random.random(t_vec.size) - 1)
# 锁相测量部分
def LockinMeasurement_func(inputVoltageSignal, t_vec, ref_freq):
# 生成参考信号
sin_ref = 2 * np.sin(2 * np.pi * ref_freq * t_vec)
cos_ref = 2 * np.cos(2 * np.pi * ref_freq * t_vec)
# 混频信号
signal_0 = inputVoltageSignal * sin_ref
signal_1 = inputVoltageSignal * cos_ref
# 低通滤波
X = np.mean(signal_0)
Y = np.mean(signal_1)
# 计算振幅和相位
A = np.sqrt(X**2 + Y**2)
phi = np.arctan2(Y, X)
return A, phi
# 参数
A = 1
phi = 0
noise = 1
ref_freq = 100
t_vec = np.linspace(0, 0.2, 1001)
# 列表来保存幅值和相位数据
amplitude_list = []
phase_list = []
freq_list = np.arange(1, 1001)
# 循环计算不同频率下的幅值和相位
i = 0
while i < len(freq_list):
freq = freq_list[i]
# 生成原始信号
Vin_vec = inputVoltageSignal_func(t_vec, A, phi, noise, freq=freq)
# 锁相测量
A, phi = LockinMeasurement_func(Vin_vec, t_vec, ref_freq=freq)
# 保存幅值和相位数据
amplitude_list.append(A)
phase_list.append(phi)
i += 1
# 绘图
plt.figure(figsize=(10, 6))
# 幅值与频率的关系图
plt.subplot(2, 1, 1)
plt.plot(freq_list, amplitude_list)
plt.xlabel('freq (Hz)')
plt.ylabel('A')
plt.title('relationship between A and freq')
# 相位与频率的关系图
plt.subplot(2, 1, 2)
plt.plot(freq_list, phase_list)
plt.xlabel('freq (Hz)')
plt.ylabel('Phi')
plt.title('relationship between Phi and freq')
plt.tight_layout()
plt.show()
```
这样,你可以使用 `while` 循环来计算不同频率下的幅值和相位,并且一次性绘制出幅值与频率的关系图和相位与频率的关系图。
阅读全文