use*_*831 6 python numpy downsampling
这似乎是一个非常直接的问题,但我想不出解决方案。假设我有一个y包含 8000 个样本的正弦函数:
import numpy as np
Fs = 8000
f = 1
npts = 8000
x = np.arange(npts)
y = np.sin(2 * np.pi * f * x / Fs)
Run Code Online (Sandbox Code Playgroud)
我想将这个函数下采样到 6000 个样本,所以我尝试了这个回答类似问题的方法......
import math
from scipy import nanmean
#number of samples I want to downsample to
npts2 = 6000
#calculating the number of NaN values to pad to the array
n = math.ceil(float(y.size)/npts2)
pad_size = n*npts2 - len(y)
padded = np.append(y, np.zeros(int(pad_size))*np.NaN)
#downsampling the reshaped padded array with nanmean
downsampled = nanmean(padded.reshape((npts2, int(n))), axis = 1)
Run Code Online (Sandbox Code Playgroud)
这给了我一个正确长度 (6000) 的数组,但最后 2000 个样本(即原始npts和之间的差异npts2)是NaN,并且函数本身只占用前 4000 个样本。
有没有更好的方法可以使这个正弦函数长度为 6000 个样本?谢谢!
编辑
感谢您的回复 - 我现在意识到我正在以错误的方式攻击它。我决定在scipy.interpolate.interp1d函数上使用该函数y,然后将一个np.linspace生成的数组传递给它,该数组生成的点数要插入到所需的点数。这给了我正确缩放的输出。
from scipy.interpolate import interp1d
def downsample(array, npts):
interpolated = interp1d(np.arange(len(array)), array, axis = 0, fill_value = 'extrapolate')
downsampled = interpolated(np.linspace(0, len(array), npts))
return downsampled
downsampled_y = downsample(y, 6000)
Run Code Online (Sandbox Code Playgroud)
小智 5
您的初始采样率 8000 不能被 6000 整除,因此不能像引用的帖子那样简单地降低采样率。在您的场景中,scipy 的重新采样应该可以工作。
from scipy import signal
downsampled = signal.resample(y, 6000)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7851 次 |
| 最近记录: |