python下采样代码python下采样函数
吴心真 2023-07-09编程经验
什么是采样?采样是在连续信号上取有限数量的值的过程。在数字信号处理中,采样是将模拟信号转换为数字信号的第一步。采样频率是以赫兹(Hz)表示的。例如,如果采样频率为1000Hz,则
什么是采样?
采样是在连续信号上取有限数量的值的过程。在数字信号处理中,采样是将模拟信号转换为数字信号的第一步。采样频率是以赫兹(Hz)表示的。例如,如果采样频率为1000Hz,则样本的采样间隔为0.001秒。下面是一个python实现的简单例子:
import numpy as np import matplotlib.pyplot as plt #采样频率 fs = 100 #采样时间间隔 ts = 1/fs #开始时间 t = np.arange(0, 1, ts) #信号 x = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t) #信号绘图 plt.plot(t,x) plt.xlabel('时间(s)') plt.ylabel('信号') plt.show()
python下常用的下采样方法
下采样是降低采样率的过程,或者说是降低信号采样频率的过程。下面列举了一些python下常用的下采样方法:
1.平均采样
平均采样就是简单地取每个采样点的平均值。下面的代码展示了如何使用numpy实现平均采样:
import numpy as np def avg_downsample(signal, ratio): #计算新信号的长度 new_len = int(signal.shape[0]/ratio) #创建新信号 new_signal = np.zeros(new_len) #对每个新信号值进行平均 for i in range(new_len): new_signal[i] = np.mean(signal[i*ratio:(i+1)*ratio]) return new_signal
2.最大值采样
最大值采样选择每个采样点的最大值。它在保持信号的主要特征方面效果较好。下面的代码展示了如何使用numpy实现最大值采样:
import numpy as np def max_downsample(signal, ratio): #计算新信号的长度 new_len = int(signal.shape[0]/ratio) #创建新信号 new_signal = np.zeros(new_len) #对每个新信号值进行最大值选择 for i in range(new_len): new_signal[i] = np.max(signal[i*ratio:(i+1)*ratio]) return new_signal
3.最小值采样
最小值采样选择每个采样点的最小值。它在信号平滑方面效果较好。下面的代码展示了如何使用numpy实现最小值采样:
import numpy as np def min_downsample(signal, ratio): #计算新信号的长度 new_len = int(signal.shape[0]/ratio) #创建新信号 new_signal = np.zeros(new_len) #对每个新信号值进行最小值选择 for i in range(new_len): new_signal[i] = np.min(signal[i*ratio:(i+1)*ratio]) return new_signal
如何评估下采样方法
下采样方法的性能可以从两个方面评估:信号保留和频带限制。
1.信号保留
对于信号保留,可以使用重构误差来评估。重构误差表示重构的信号与原始信号之间的误差。下面是一个计算重构误差的示例:
import numpy as np #原始信号 signal = np.random.rand(100) #下采样系数 ratio = 5 #平均采样 avg_signal = avg_downsample(signal, ratio) #最大值采样 max_signal = max_downsample(signal, ratio) #最小值采样 min_signal = min_downsample(signal, ratio) #计算重构误差 avg_error = np.linalg.norm(signal-avg_signal,2)/np.linalg.norm(signal,2) max_error = np.linalg.norm(signal-max_signal,2)/np.linalg.norm(signal,2) min_error = np.linalg.norm(signal-min_signal,2)/np.linalg.norm(signal,2) print('平均采样重构误差:{},最大值采样重构误差:{},最小值采样重构误差:{}'.format(avg_error, max_error, min_error))
2.频带限制
对于频带限制,可以使用功率谱密度(PSD)来评估。PSD表示信号的功率分布在频域上的情况。下面是一个计算PSD的示例:
import numpy as np import matplotlib.pyplot as plt #原始信号 signal = np.random.rand(100) #下采样系数 ratio = 5 #平均采样 avg_signal = avg_downsample(signal, ratio) #最大值采样 max_signal = max_downsample(signal, ratio) #最小值采样 min_signal = min_downsample(signal, ratio) #计算PSD fs = 100 f, Pxx_signal = signal.periodogram(signal, fs) f, Pxx_avg_signal = signal.periodogram(avg_signal, fs/ratio) f, Pxx_max_signal = signal.periodogram(max_signal, fs/ratio) f, Pxx_min_signal = signal.periodogram(min_signal, fs/ratio) #绘制PSD plt.semilogx(f, Pxx_signal, label='原始信号') plt.semilogx(f, Pxx_avg_signal, label='平均采样信号') plt.semilogx(f, Pxx_max_signal, label='最大值采样信号') plt.semilogx(f, Pxx_min_signal, label='最小值采样信号') plt.xlabel('频率(Hz)') plt.ylabel('功率') plt.legend() plt.show()
很赞哦! ()