#python-3.x #numpy #jupyter-notebook #anaconda #miniconda
Вопрос:
Я использую python для ноутбука miniconda jupyter и пытаюсь реализовать машину (фильтрация звука). Я получил эту ошибку и действительно не знаю, как ее исправить.
Здесь я импортировал нужные мне библиотеки с указанием пути к файлу:
import wave as we
import numpy as np
import matplotlib.pyplot as plt
dir = r'/home/pc/Downloads/Bubble audios'
Вот функция, которая должна построить график:
def read_wav(wavfile, plots=True, normal=False):
f = wavfile
params = f.getparams()
# print(params)
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes) # , string format
waveData = np.frombuffer(strData, dtype=np.int16) # Convert a string to an int
# wave amplitude normalization
if normal == True:
waveData = waveData*1.0/(max(abs(waveData)))
#
if plots == True:
time = np.arange(0, nframes ,dtype=np.int16) *(1.0 / framerate)
plt.figure(dpi=100)
plt.plot(time, waveData)
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.title("Single channel wavedata")
plt.show()
return (Wave, time)
def fft_wav(waveData, plots=True):
f_array = np.fft.fft(waveData) # Fourier transform, the result is a complex array
f_abs = f_array
axis_f = np.linspace(0, 250, np.int(len(f_array)/2)) # map to 250
# axis_f = np.linspace(0, 250, np.int(len(f_array))) # map to 250
if plots == True:
plt.figure(dpi=100)
plt.plot(axis_f, np.abs(f_abs[0:len(axis_f)]))
# plt.plot(axis_f, np.abs(f_abs))
plt.xlabel("Frequency")
plt.ylabel("Amplitude spectrum")
plt.title("Tile map")
plt.show()
return f_abs
И здесь я вызываю функцию с файлом, который я хочу прочитать и отобразить.
f = we.open(dir r'/Ars1_Aufnahme.wav', 'rb')
Wave, time = read_wav(f)
Ошибка, которую я получил:
ValueError: x and y must have same first dimension, but have shapes (2140699,) and (4281398,)
Я попытался использовать np.reshape, но это не сработало, или я мог использовать его неправильно. Итак, есть какие-нибудь советы?
Комментарии:
1. Вы уверены, что ваш файл .wav является монофоническим? Я попробовал с монофайлом, и ваша функция правильно возвращает сюжет.
Ответ №1:
похоже, что ваше время составляет 1/2 размера вашей волны. Может быть, ваш nframe
слишком короткий. Если вы это сделаете nframses = 2*nframes
, в чем ошибка ?
Комментарии:
1. Я отредактировал до 2*n кадров, и это сработало. Спасибо