Как построить звуковую форму волны в PyQtGraph - PullRequest
0 голосов
/ 25 июня 2018

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

Я попытался построить его с помощью matplotlib, и он работает очень хорошо.

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

 def waveform(self, audio):
    self.waveFile = wave.open(audio, 'rb')  # reading wave file
    format = p.get_format_from_width(self.waveFile.getsampwidth())
    channel = self.waveFile.getnchannels()
    rate = self.waveFile.getframerate()
    self.frame = self.waveFile.getnframes()
    self.stream = p.open(format=format,  # DATA needed for streaming
                         channels=channel,
                         rate=rate,
                         output=True)

    durationF = self.frame / float(rate)
    plt.title('Audio Waveform')
    self.data_int = self.waveFile.readframes(self.frame)
    self.data_plot = np.fromstring(self.data_int, dtype=np.short)
    self.data_plot.shape = -1, 2
    self.data_plot = self.data_plot.T
    self.time = np.arange(0, self.frame) * (1.0 / rate)
    self.fig = Figure(figsize=(30, 6), dpi=30)
    self.fig.set_size_inches(34, 5.3)
    self.fig.subplots_adjust(left=0.05, bottom=0.09, right=1.05, top=1.00, wspace=0, hspace=0)
    self.fig.tight_layout()
    self.xticks = np.arange(0, self.timeDuration, 15)
    self.wavePlot = self.fig.add_subplot(111)
    self.wavePlot.set_xticks(self.xticks)
    if (channel == 1):
        print 'Just mono files only'
        self.wavePlot.plot(self.time, self.data_plot[0])

    elif (channel == 2):
        print 'Just stereo files only'
        self.wavePlot.plot(self.time, self.data_plot[1], c="b")

    self.wavePlot.tick_params(axis='both', which="major", labelsize=20)
    self.wavePlot.tick_params(axis='both', which="minor", labelsize=30)

    self.canvas = FigureCanvasTkAgg(self.fig, self.waveFrame)
    self.canvas.get_tk_widget().grid(row=0, column=0, sticky="nsew")

И когда я обнаружил PyQtGraph, я переключился на него для более интерактивной и быстрой прорисовки. Теперь, когда я делаю это почти с одной и той же вещью в PyQt / PyQtGraph, появляются ошибки, и я больше не могу их отобразить.

Вот мой код для построения графика с PyQtGraph в PyQT4:

 def waveform(self, audio):
    self.waveFile = wave.open(audio,'rb')
    self.format = p.get_format_from_width(self.waveFile.getsampwidth())
    channel = self.waveFile.getnchannels()
    self.rate = self.waveFile.getframerate()
    self.frame = self.waveFile.getnframes()
    self.stream = p.open(format=self.format,  # DATA needed for streaming
                         channels=channel,
                         rate=self.rate,
                         output=True)

    durationF = self.frame / float(self.rate)

    #Setting up waveform plot
    self.data_int = self.waveFile.readframes(self.frame)
    self.data_plot = np.fromstring(self.data_int, 'Int16')
    self.time = np.arange(0, self.frame) * (1.0 / self.rate)

     self.win = pg.GraphicsWindow(title='Spectrum Analyzer')
    self.win.setWindowTitle('Spectrum Analyzer')
    self.win.setGeometry(5, 115, 1910, 1070)

    wf_xlabels = [(0, '0'), (2048, '2048'), (4096, '4096')]
    wf_xaxis = pg.AxisItem(orientation='bottom')
    wf_xaxis.setTicks([wf_xlabels])

    wf_ylabels = [(0, '0'), (127, '128'), (255, '255')]
    wf_yaxis = pg.AxisItem(orientation='left')
    wf_yaxis.setTicks([wf_ylabels])

    self.waveform = self.win.addPlot(
        title='WAVEFORM', row=1, col=1, axisItems={'bottom': wf_xaxis, 
              'left': wf_yaxis},
              )
    self.waveform.plot(pen='c', width=3)
    self.waveform.setYRange(0,255, padding=0)
    self.waveform.setXRange(0,2 * self.chunk, padding = 0.005)
    self.waveform.plot(self.time, self.data_plot)

Когда я запускаю приведенный выше код, появляется ошибка --- в updateData повысить исключение («массивы X и Y должны быть одинаковой формы - получено% s и% s.»% (self.xData.shape, self.yData.shape)) Исключение: массивы X и Y должны быть одинаковой формы - полученные (1535696L,) и (767848L,).

Я пробовал разные способы заговора, и я не нашел никакого решения, чтобы построить его. Интересно, почему код matplotlib хорошо работает с ним, а PyQtGraph - нет? Любой ответ будет большой помощью.

1 Ответ

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

X и Y должны иметь одинаковую длину. В вашем сообщении об ошибке один в два раза длиннее другого.

В вашем примере кода MatPlotLib есть некоторый код, который, по-видимому, преобразует self.data_plot в две строки.

self.data_plot.shape = -1, 2
self.data_plot = self.data_plot.T

Эта функция отсутствует в коде PyQtGraph.

...