Python 卷积后的数据后处理
Postprocessing data after convolution in Python
请假设我们有以下测试信号:
import numpy as np
fs = 10000
f1 = 60
duration = 10
samples = int(fs*duration)
t = np.arange(samples) / fs
signal = 15 * t * np.sin(2.0*np.pi*f1*t)
使用卷积计算 RMS 值的方法如下:
def calculate_rms(signal, N):
sig2 = np.power(signal,2)
window = np.ones(N)/float(N)
return np.sqrt(np.convolve(sig2, window, 'valid'))
N = (1.0 / f1) * fs
RMS = calculate_rms(signal,N)
然而,在卷积之后,RMS
当然比t
和signal
有更少的数据点,我不知道如何后处理t
和signal
以便能够将它们与 RMS
一起绘制为 signal=f(t)
和 RMS=f(t)
在同一图中,而不会扭曲时间维度。
选项 1
在 np.convolve
中,使用模式 'same'
而不是 'valid'
(有关详细信息,请参阅 the docs)。如果这样做,RMS
将具有与 t
和 signal
相同的形状。边缘可能存在边界效应,但这些效应可能非常小,可能不会影响您的绘图。
选项 2
如果您迫切希望保持结果不受可能的边界影响,您可以裁剪 t
和 signal
以对应 RMS
覆盖的区域。由于卷积的 valid
部分从 window 大小的一半开始,因此可以按如下方式完成。
t_cropped = t[int(N)//2:-int(N)//2+1]
signal_cropped = signal[int(N)//2:-int(N)//2+1]
请假设我们有以下测试信号:
import numpy as np
fs = 10000
f1 = 60
duration = 10
samples = int(fs*duration)
t = np.arange(samples) / fs
signal = 15 * t * np.sin(2.0*np.pi*f1*t)
使用卷积计算 RMS 值的方法如下:
def calculate_rms(signal, N):
sig2 = np.power(signal,2)
window = np.ones(N)/float(N)
return np.sqrt(np.convolve(sig2, window, 'valid'))
N = (1.0 / f1) * fs
RMS = calculate_rms(signal,N)
然而,在卷积之后,RMS
当然比t
和signal
有更少的数据点,我不知道如何后处理t
和signal
以便能够将它们与 RMS
一起绘制为 signal=f(t)
和 RMS=f(t)
在同一图中,而不会扭曲时间维度。
选项 1
在 np.convolve
中,使用模式 'same'
而不是 'valid'
(有关详细信息,请参阅 the docs)。如果这样做,RMS
将具有与 t
和 signal
相同的形状。边缘可能存在边界效应,但这些效应可能非常小,可能不会影响您的绘图。
选项 2
如果您迫切希望保持结果不受可能的边界影响,您可以裁剪 t
和 signal
以对应 RMS
覆盖的区域。由于卷积的 valid
部分从 window 大小的一半开始,因此可以按如下方式完成。
t_cropped = t[int(N)//2:-int(N)//2+1]
signal_cropped = signal[int(N)//2:-int(N)//2+1]