numpy 规范化介于-1和1之间的值(包括-1和1)

gfttwv5a  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(224)

我正在尝试使用Numpy在Python中生成一个.wav文件。我的电压范围在0-5V之间,我需要将它们归一化在-1和1之间,以便在.wav文件中使用它们。
我看过this网站,它使用numpy生成一个wav文件,但用于规范化的算法不再可用。
有人能解释一下我是如何在我的Raspberry Pi上用Python生成这些值的吗?

oyxsuwqo

oyxsuwqo1#

这不是一个简单的计算吗?除以最大值的一半,再减去1:

In [12]: data=np.linspace(0,5,21)

In [13]: data
Out[13]: 
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ,
        2.25,  2.5 ,  2.75,  3.  ,  3.25,  3.5 ,  3.75,  4.  ,  4.25,
        4.5 ,  4.75,  5.  ])

In [14]: data/2.5-1.
Out[14]: 
array([-1. , -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1,  0. ,
        0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
vxqlmq5t

vxqlmq5t2#

您可以在sklearn.preprocessing.StandardScaler中使用fit_transform方法。此方法将从数据中删除均值,并将数组缩放为单位方差(-1,1)

from sklearn.preprocessing import StandardScaler
data = np.asarray([[0, 0, 0],
     [1, 1, 1],
     [2,1, 3]])
data = StandardScaler().fit_transform(data)

如果您打印出数据,您现在将拥有:

[[-1.22474487 -1.41421356 -1.06904497]
[ 0.          0.70710678 -0.26726124]
[ 1.22474487  0.70710678  1.33630621]]
m3eecexj

m3eecexj3#

下面的函数应该可以执行您想要的操作,而不考虑输入数据的范围,也就是说,如果您有负值,它也可以工作。

import numpy as np
def my_norm(a):
    ratio = 2/(np.max(a)-np.min(a)) 
    #as you want your data to be between -1 and 1, everything should be scaled to 2, 
    #if your desired min and max are other values, replace 2 with your_max - your_min
    shift = (np.max(a)+np.min(a))/2 
    #now you need to shift the center to the middle, this is not the average of the values.
    return (a - shift)*ratio

my_norm(data)

相关问题