def __init__(self, logger): self.logger = logger super(MainWindow, self).__init__() self.ui = Terzpegelmesser.Ui_MainWindow() self.ui.setupUi(self) self.chunk_number = 0 self.buffer_timer_time = 0. self.cpu_percent = 0. self.setMinimumSize(1000, 600) # Initialize the audio data ring buffer self.audiobuffer = AudioBuffer(self.logger) # Initialize the audio device self.audio_device = AudioDevice(self.logger) # Initialize the blocklength self.blocklength = 2048 self.ui.BoxFFT.setCurrentIndex(6) self.logger.push("initial set Blocksize to " + str(self.blocklength)) # Initialize the frequency weighting flag self.weight = 0 # Initialize the number of samples shown in waveform monitor self.window = 128 # Initialize the number of periods shown in waveform monitor self.NumberOfPeriods = 10 # Initialize the flag for lin (0) and log (1) fft plotting self.plotflag = 1 devices = self.audio_device.get_readable_devices_list() for device in devices: self.ui.DeviceList.addItem(device) current_device = self.audio_device.get_readable_current_device() self.ui.DeviceList.setCurrentIndex(current_device) self.display_timer = QTimer() self.display_timer.setInterval(SMOOTH_DISPLAY_TIMER_PERIOD_MS) self.connect(self.display_timer, SIGNAL('timeout()'), self.update_buffer) self.connect(self.ui.ButtonStartStop, SIGNAL('triggered()'), self.stream_run) self.connect(self.ui.DeviceList, SIGNAL('currentIndexChanged(int)'), self.input_device_changed) self.connect(self.ui.BoxFFT, SIGNAL('currentIndexChanged(int)'), self.update_blocklength) self.ui.action32.triggered.connect(lambda: self.update_blocklength(0)) self.ui.action32.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(0)) self.ui.action64.triggered.connect(lambda: self.update_blocklength(1)) self.ui.action64.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(1)) self.ui.action128.triggered.connect(lambda: self.update_blocklength(2)) self.ui.action128.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(2)) self.ui.action256.triggered.connect(lambda: self.update_blocklength(3)) self.ui.action256.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(3)) self.ui.action512.triggered.connect(lambda: self.update_blocklength(4)) self.ui.action512.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(4)) self.ui.action1024.triggered.connect(lambda: self.update_blocklength( 5)) self.ui.action1024.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(5)) self.ui.action2048.triggered.connect(lambda: self.update_blocklength( 6)) self.ui.action2048.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(6)) self.ui.action4096.triggered.connect(lambda: self.update_blocklength( 7)) self.ui.action4096.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(7)) self.ui.action8192.triggered.connect(lambda: self.update_blocklength( 8)) self.ui.action8192.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(8)) self.ui.actionNone.triggered.connect(lambda: self.update_weight(0)) self.ui.actionNone.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(0)) self.ui.actionA.triggered.connect(lambda: self.update_weight(1)) self.ui.actionA.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(1)) self.ui.actionC.triggered.connect(lambda: self.update_weight(2)) self.ui.actionC.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(2)) self.connect(self.ui.BoxBew, SIGNAL('currentIndexChanged(int)'), self.update_weight) self.connect(self.ui.RadioLin, SIGNAL("clicked()"), self.update_plotflag_lin) self.connect(self.ui.RadioLog, SIGNAL("clicked()"), self.update_plotflag_log) self.ui.actionLogarithmic.triggered.connect(self.update_plotflag_log) self.ui.actionLogarithmic.triggered.connect( lambda: self.ui.RadioLog.setChecked(True)) self.ui.actionLinear.triggered.connect(self.update_plotflag_lin) self.ui.actionLinear.triggered.connect( lambda: self.ui.RadioLin.setChecked(True)) self.connect(self.ui.push_plus, SIGNAL("clicked()"), self.update_NumberOfPeriods_minus) self.ui.actionZoom_Out.triggered.connect( self.update_NumberOfPeriods_plus) self.connect(self.ui.push_minus, SIGNAL("clicked()"), self.update_NumberOfPeriods_plus) self.ui.actionZoom_In.triggered.connect( self.update_NumberOfPeriods_minus) self.gain_plotter = ( gain_plotter.Gain_Plotter(self.ui.PlotGainVerlauf, self.audiobuffer)) self.spektro_plotter = ( third_octave_plotter.SpektroPlotter(self.ui.PlotTerzpegel, self.audiobuffer)) self.waveform = waveform.Oszi(self.ui.PlotWellenform, self.audiobuffer, self.NumberOfPeriods) self.channelplotter = ( channel_plotter.ChannelPlotter(self.ui.PlotKanalpegel, self.audiobuffer)) self.specgramplot = ( spectrogram_plotter.Spectrogram_Plot(self.ui.PlotSpektrogramm, self.audiobuffer)) self.spektro_plotter_2 = ( third_octave_plotter.SpektroPlotter(self.ui.PlotTerzpegel_2, self.audiobuffer)) self.fft_plot = fft_plotter.FFTPlotter(self.ui.PlotFFT, self.audiobuffer, self.blocklength, self.plotflag) # if the startStop button is clicked, the timer starts and the stream is # filled with acoustic data self.ui.ButtonStartStop.clicked.connect(self.stream_run) self.ui.ButtonStartStop.state = 0 self.display_timer.timeout.connect(self.update_plot)
class MainWindow(QMainWindow): def __init__(self, logger): self.logger = logger super(MainWindow, self).__init__() self.ui = Terzpegelmesser.Ui_MainWindow() self.ui.setupUi(self) self.chunk_number = 0 self.buffer_timer_time = 0. self.cpu_percent = 0. self.setMinimumSize(1000, 600) # Initialize the audio data ring buffer self.audiobuffer = AudioBuffer(self.logger) # Initialize the audio device self.audio_device = AudioDevice(self.logger) # Initialize the blocklength self.blocklength = 2048 self.ui.BoxFFT.setCurrentIndex(6) self.logger.push("initial set Blocksize to " + str(self.blocklength)) # Initialize the frequency weighting flag self.weight = 0 # Initialize the number of samples shown in waveform monitor self.window = 128 # Initialize the number of periods shown in waveform monitor self.NumberOfPeriods = 10 # Initialize the flag for lin (0) and log (1) fft plotting self.plotflag = 1 devices = self.audio_device.get_readable_devices_list() for device in devices: self.ui.DeviceList.addItem(device) current_device = self.audio_device.get_readable_current_device() self.ui.DeviceList.setCurrentIndex(current_device) self.display_timer = QTimer() self.display_timer.setInterval(SMOOTH_DISPLAY_TIMER_PERIOD_MS) self.connect(self.display_timer, SIGNAL('timeout()'), self.update_buffer) self.connect(self.ui.ButtonStartStop, SIGNAL('triggered()'), self.stream_run) self.connect(self.ui.DeviceList, SIGNAL('currentIndexChanged(int)'), self.input_device_changed) self.connect(self.ui.BoxFFT, SIGNAL('currentIndexChanged(int)'), self.update_blocklength) self.ui.action32.triggered.connect(lambda: self.update_blocklength(0)) self.ui.action32.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(0)) self.ui.action64.triggered.connect(lambda: self.update_blocklength(1)) self.ui.action64.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(1)) self.ui.action128.triggered.connect(lambda: self.update_blocklength(2)) self.ui.action128.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(2)) self.ui.action256.triggered.connect(lambda: self.update_blocklength(3)) self.ui.action256.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(3)) self.ui.action512.triggered.connect(lambda: self.update_blocklength(4)) self.ui.action512.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(4)) self.ui.action1024.triggered.connect(lambda: self.update_blocklength( 5)) self.ui.action1024.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(5)) self.ui.action2048.triggered.connect(lambda: self.update_blocklength( 6)) self.ui.action2048.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(6)) self.ui.action4096.triggered.connect(lambda: self.update_blocklength( 7)) self.ui.action4096.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(7)) self.ui.action8192.triggered.connect(lambda: self.update_blocklength( 8)) self.ui.action8192.triggered.connect( lambda: self.ui.BoxFFT.setCurrentIndex(8)) self.ui.actionNone.triggered.connect(lambda: self.update_weight(0)) self.ui.actionNone.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(0)) self.ui.actionA.triggered.connect(lambda: self.update_weight(1)) self.ui.actionA.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(1)) self.ui.actionC.triggered.connect(lambda: self.update_weight(2)) self.ui.actionC.triggered.connect( lambda: self.ui.BoxBew.setCurrentIndex(2)) self.connect(self.ui.BoxBew, SIGNAL('currentIndexChanged(int)'), self.update_weight) self.connect(self.ui.RadioLin, SIGNAL("clicked()"), self.update_plotflag_lin) self.connect(self.ui.RadioLog, SIGNAL("clicked()"), self.update_plotflag_log) self.ui.actionLogarithmic.triggered.connect(self.update_plotflag_log) self.ui.actionLogarithmic.triggered.connect( lambda: self.ui.RadioLog.setChecked(True)) self.ui.actionLinear.triggered.connect(self.update_plotflag_lin) self.ui.actionLinear.triggered.connect( lambda: self.ui.RadioLin.setChecked(True)) self.connect(self.ui.push_plus, SIGNAL("clicked()"), self.update_NumberOfPeriods_minus) self.ui.actionZoom_Out.triggered.connect( self.update_NumberOfPeriods_plus) self.connect(self.ui.push_minus, SIGNAL("clicked()"), self.update_NumberOfPeriods_plus) self.ui.actionZoom_In.triggered.connect( self.update_NumberOfPeriods_minus) self.gain_plotter = ( gain_plotter.Gain_Plotter(self.ui.PlotGainVerlauf, self.audiobuffer)) self.spektro_plotter = ( third_octave_plotter.SpektroPlotter(self.ui.PlotTerzpegel, self.audiobuffer)) self.waveform = waveform.Oszi(self.ui.PlotWellenform, self.audiobuffer, self.NumberOfPeriods) self.channelplotter = ( channel_plotter.ChannelPlotter(self.ui.PlotKanalpegel, self.audiobuffer)) self.specgramplot = ( spectrogram_plotter.Spectrogram_Plot(self.ui.PlotSpektrogramm, self.audiobuffer)) self.spektro_plotter_2 = ( third_octave_plotter.SpektroPlotter(self.ui.PlotTerzpegel_2, self.audiobuffer)) self.fft_plot = fft_plotter.FFTPlotter(self.ui.PlotFFT, self.audiobuffer, self.blocklength, self.plotflag) # if the startStop button is clicked, the timer starts and the stream is # filled with acoustic data self.ui.ButtonStartStop.clicked.connect(self.stream_run) self.ui.ButtonStartStop.state = 0 self.display_timer.timeout.connect(self.update_plot) def update_plot(self): isvis_FFT = self.ui.PlotFFT.isVisible() self.channelplotter.plot() self.gain_plotter.plot() self.spektro_plotter.plot(self.weight) self.spektro_plotter_2.plot(self.weight) self.waveform.plot(self.NumberOfPeriods) if isvis_FFT == False: self.specgramplot.plotspecgram() if isvis_FFT == True: self.fft_plot.plot(self.blocklength, self.plotflag) # opens stream if there is none, else closes it def stream_run(self): if self.ui.ButtonStartStop.state == 0: #openstream() self.logger.push("Timer start") self.display_timer.start() self.ui.ButtonStartStop.setText("Stop") self.display_timer.start() print(logger.log) self.ui.ButtonStartStop.state = 1 else: #closestream() self.logger.push("Timer stop") self.display_timer.stop() self.ui.ButtonStartStop.setText("Start") self.display_timer.stop() self.ui.ButtonStartStop.state = 0 print(logger.log) def update_buffer(self): chunks, t, newpoints = ( self.audio_device.update(self.audiobuffer.ringbuffer)) self.audiobuffer.set_newdata(newpoints) self.chunk_number += chunks self.buffer_timer_time = (95. * self.buffer_timer_time + 5. * t) / 100. def update_blocklength(self, newblocklength): self.blocklength = 32 * (2 ** newblocklength) self.logger.push("Blocksize changed to " + str(self.blocklength)) print(logger.log) self.fft_plot.must_plot = True def update_NumberOfPeriods_plus(self): self.NumberOfPeriods += 1 self.logger.push("Desired number of periods: " + str(self.NumberOfPeriods)) print(logger.log) def update_NumberOfPeriods_minus(self): self.NumberOfPeriods -= 1 # sets lower limit of self.NumberOfPeriods to 1 if self.NumberOfPeriods < 1: self.NumberOfPeriods = 1 self.logger.push("Desired number of periods: " + str(self.NumberOfPeriods)) print(logger.log) def update_weight(self, weight): self.weight = weight if self.weight == 0: self.logger.push("Using Z Curve (unweighted)") print(logger.log) elif self.weight == 1: self.logger.push("Using A Curve") print(logger.log) elif self.weight == 2: self.logger.push("Using C Curve") print(logger.log) else: print self.weight def update_plotflag_lin(self): self.plotflag = 0 self.logger.push("Linear frequency axis selected") self.fft_plot.must_plot = True print(logger.log) def update_plotflag_log(self): self.plotflag = 1 self.logger.push("Logarithmic frequency axis selected") self.fft_plot.must_plot = True print(logger.log) def input_device_changed(self, index): success, index = self.audio_device.select_input_device(index) self.ui.DeviceList.setCurrentIndex(index) self.fft_plot.must_plot = True if not success: # Note: the error message is a child of the settings dialog, so that # that dialog remains on top when the error message is closed error_message = QErrorMessage(self.settings_dialog) error_message.setWindowTitle("Input device error") error_message.showMessage("Impossible to use the selected input" " device, reverting to the previous one") def statistics(self): if not self.about_dialog.LabelStats.isVisible(): return label = "Chunk #%d\n"\ "Audio buffer retrieval: %.02f ms\n"\ "Global CPU usage: %d %%\n"\ "Number of overflowed inputs (XRUNs): %d"\ % (self.chunk_number, self.buffer_timer_time, self.cpu_percent, self.audio_device.xruns) self.about_dialog.LabelStats.setText(label)