Масштабирование вектора от -1 до 1 - PullRequest
0 голосов
/ 22 февраля 2020

В настоящее время я пытаюсь обработать голосовой сигнал. Я масштабировал вектор от -1 до 1. Мне удалось это сделать, но посмотрите на график полученного мной вектора. Мне нужно, чтобы этот сигнал был центрирован на 0, чтобы получить вектор признаков, который будет передан нейронной сети. Это немного ниже 0.

Как я могу масштабировать этот вектор между -1 и 1 и сохранить центрирование на 0?

Исходный сигнал: введите описание изображения здесь

Масштабированный сигнал: введите описание изображения здесь

Код и и нормализация функция:

samplerate, data = wavfile.read('avarii.wav')
times = np.arange(len(data))/float(samplerate)
print(times)
print(len(data))
print(samplerate)
# Make the plot
# You can tweak the figsize (width, height) in inches

#unit_vector = norm(data[:,1])


samples = data[:,1].tolist()

normalized_vector = norm(samples,-1,1)


#print(norm_vect) 
plt.figure(figsize=(30, 4))

plt.plot(times,normalized_vector)
# plt.fill_between(times, data[:,0], data[:,1], color='k') 
plt.xlim(times[0], times[-1])
plt.xlabel('time (s)')
plt.ylabel('amplitude')
# You can set the format by changing the extension
# like .pdf, .svg, .eps
plt.savefig('plot.png', dpi=100)
plt.show()
def norm(vector,a,b):



    #normalized_vector = []
    #standard_deviation = stdev(vector)

    max_value = max(vector)
    min_value = min(vector)
    #average = sum(vector)/len(vector)
    print(max_value)
    print(min_value)
    print(average)
    for value in vector:
        #value = value  - average
        norm_value = a + ((value - min_value)*(b-a))/(max_value - min_value)
        normalized_vector.append(norm_value)   

    # for value in vector:
    #     normalized_vector.append((value - average)/standard_deviation)


    # for value in vector:

    #     normalized_vector.append((value - min_value) / (max_value-min_value))

    return normalized_vector

В заключение я хочу ограничить значения этих выборок между [-1,1] и центром в 0. Как я могу это сделать?

1 Ответ

0 голосов
/ 22 февраля 2020

Прежде всего, у вас есть numpy массивы. Не конвертируйте их в список, а затем вычисляйте значения по одному. Используйте силу numpy.

Итак, вот копия вашего решения, просто с numpy:

samples = data[:,1]
min_value, max_value = samples.min(), samples.max()
normalized_vector = -1 + (samples - min_value) * 2 / (max_value - min_value)

Теперь, что вы спросили: причина, по которой ноль ушел это потому, что положительный пик больше, чем отрицательный пик, поэтому центр не в нуле. Вы должны масштабировать положительное и отрицательное в равной степени:

samples = data[:,1]
max_peak = np.absolute(samples).max()
normalized_vector = samples / max_peak

Вот и все.

...