c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

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()

文章评论