PyQT Graph - графическое отображение огромно - PullRequest
0 голосов
/ 29 июня 2018

У меня есть код, отображающий форму звукового файла в графике PyQT, к сожалению, график кажется таким большим.

Я пока не могу прикрепить изображение, поэтому предоставлю ссылку на скриншот сделанного мной графика.

enter image description here

А вот и мой код:

 self.waveFile = wave.open(audio,'rb')
 self.format = pyaudio.paInt16
 channel = self.waveFile.getnchannels()
 self.rate = self.waveFile.getframerate()
 self.frame = self.waveFile.getnframes()
 self.stream = p.open(format=self.format, 
                         channels=channel,
                         rate=self.rate,
                         output=True)

 durationF = self.frame / float(self.rate)
 self.data_int = self.waveFile.readframes(self.frame)
 self.data_plot = np.fromstring(self.data_int, 'Int16')
 self.data_plot.shape = -1, 2
 self.data_plot = self.data_plot.T
 self.time = np.arange(0, self.frame) * (1.0 / self.rate)

 w = pg.plot()
 w.plot(self.time, self.data_plot[0])

Нужно ли мне регулировать пределы диапазона X и Y? Должен ли я отрегулировать пик Y? Как вы можете видеть совпадения X (время) из аудио файла, который я использовал с продолжительностью 8 секунд. Но Y не (?). Я не уверен, как настроить данные формы волны, чтобы они могли поместиться в окне. Любые ответы и предложения будут очень полезны!

1 Ответ

0 голосов
/ 29 июня 2018

Я думаю, есть несколько вариантов в зависимости от того, что вы хотите показать.

1: настройка предела Y ​​

Самое простое решение - масштабировать ось Y.

# See docs for function setYrange
# setYRange(min, max, padding=None, update=True)
w.setRange(YRange=[min,max])

Вы можете проверить документы здесь .

То есть, если вы хотите сохранить все аудио значения такими же, как они есть в настоящее время, хотя вам действительно нужны аудио данные в терминах этих значений? Обычно аудиоданные отображаются в виде числа от -1 до +1, по крайней мере, для научных целей.

2: настроить ваши данные

Как уже говорилось ранее, аудиоданные имеют тенденцию быть наиболее полезными, когда их масштабируется от -1 до +1; Нам просто легче взглянуть на него и сразу почувствовать, правильна ли амплитуда (например, если мы тестировали программу усиления). Существует множество других библиотек Python, кроме встроенного модуля wave , который справится с этим намного проще для вас, например PySoundFile или многих других (см. Этот SO post для других методов чтения файлов .wav в Python).

В противном случае вы можете преобразовать данные, полученные из волнового модуля, в данные с плавающей запятой, используя что-то вроде этого (для кода yeeking ):

import wave
import struct
import sys

def wav_to_floats(wave_file):
    w = wave.open(wave_file)
    astr = w.readframes(w.getnframes())
    # convert binary chunks to short 
    a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
    a = [float(val) / pow(2, 15) for val in a]
    return a

# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print  "in the range "+str(min(signal))+" to "+str(min(signal))

Если возможно, использование библиотеки всегда лучше в этом случае, потому что волновой модуль в его нынешнем виде не поддерживает много вариантов использования аудио (насколько я знал, только моно 16-битное аудио) .

Примечание : Если вы преобразуете его в данные -1 в +1, вероятно, все еще стоит отрегулировать Y-предел, как описано в части 1. Просто, чтобы избежать странного масштабирования при загрузке различных файлов .wav.

...