def __init__(self, parent=None, logger=PrintLogger()): super().__init__(parent) self.setObjectName("LongLevels_Widget") self.logger = logger self.setObjectName("Scope_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneUp = TimePlot(self, self.logger) self.PlotZoneUp.setObjectName("PlotZoneUp") self.PlotZoneUp.setverticaltitle("Level (dB FS RMS)") self.PlotZoneUp.sethorizontaltitle("Time (min)") self.PlotZoneUp.setTrackerFormatter(lambda x, y: "%.3g min, %.3g" % (x, y)) self.level_min = DEFAULT_LEVEL_MIN self.level_max = DEFAULT_LEVEL_MAX self.PlotZoneUp.setverticalrange(self.level_min, self.level_max) self.gridLayout.addWidget(self.PlotZoneUp, 0, 0, 1, 1) self.logger = logger self.audiobuffer = None # initialize the settings dialog self.settings_dialog = LongLevels_Settings_Dialog(self, self.logger) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.level = None # 1e-30 self.level_rms = -200. self.two_channels = False self.i = 0 self.old_index = 0 #self.response_time = 60. # 1 minute self.response_time = 20. # how many times we should decimate to end up with 100 points in the kernel self.Ndec = int(max(0, np.floor((np.log2(self.response_time * SAMPLING_RATE/100.))))) Ngauss = 4 self.b = np.array(gauss(10*Ngauss+1, 2.*Ngauss)) self.a = np.zeros(self.b.shape) self.a[0] = 1. self.zf = np.zeros(max(len(self.b), len(self.a)) - 1) self.subsampled_sampling_rate = SAMPLING_RATE / 2 ** (self.Ndec) self.subsampler = Subsampler(self.Ndec) self.length_seconds = 60.*10 # actually this should be linked to the pixel width of the plot area self.length_samples = self.length_seconds * self.subsampled_sampling_rate # ringbuffer for the subsampled data self.ringbuffer = RingBuffer(self.logger)
def __init__(self, parent, logger = None): QtGui.QWidget.__init__(self, parent) # store the logger instance if logger is None: self.logger = parent.parent().logger else: self.logger = logger self.parent = parent self.setObjectName("Spectrogram_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneImage = ImagePlot(self, self.logger) self.PlotZoneImage.setObjectName("PlotZoneImage") self.gridLayout.addWidget(self.PlotZoneImage, 0, 1, 1, 1) self.audiobuffer = None # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE*32 self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.spectrogram_timer_time = 0. self.timerange_s = DEFAULT_TIMERANGE self.canvas_width = 100. self.PlotZoneImage.setlog10freqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneImage.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneImage.setspecrange(self.spec_min, self.spec_max) self.PlotZoneImage.setweighting(self.weighting) self.PlotZoneImage.settimerange(self.timerange_s) # this timer is used to update the spectrogram widget, whose update period # is fixed by the time scale and the width of the widget canvas self.timer = QtCore.QTimer() self.period_ms = SMOOTH_DISPLAY_TIMER_PERIOD_MS self.timer.setInterval(self.period_ms) # variable timing # initialize the settings dialog self.settings_dialog = Spectrogram_Settings_Dialog(self, self.logger) # timer ticks self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.timer_slot) # window resize self.connect(self.PlotZoneImage.plotImage.canvasscaledspectrogram, QtCore.SIGNAL("canvasWidthChanged"), self.canvasWidthChanged) # we do not use the display timer since we have a special one # tell the caller by setting this variable as None self.update = None
def __init__(self, parent, audiobackend, logger=PrintLogger()): super().__init__(parent) self.logger = logger self.setObjectName("Spectrogram_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneImage = ImagePlot(self, self.logger, audiobackend) self.PlotZoneImage.setObjectName("PlotZoneImage") self.gridLayout.addWidget(self.PlotZoneImage, 0, 1, 1, 1) self.audiobuffer = None self.audiobackend = audiobackend # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2 ** DEFAULT_FFT_SIZE * 32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.update_weighting() self.freq = self.proc.get_freq_scale() self.timerange_s = DEFAULT_TIMERANGE self.canvas_width = 100. self.old_index = 0 self.overlap = 3. / 4. self.overlap_frac = Fraction(3, 4) self.dT_s = self.fft_size * (1. - self.overlap) / float(SAMPLING_RATE) self.PlotZoneImage.setlog10freqscale() # DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneImage.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneImage.setspecrange(self.spec_min, self.spec_max) self.PlotZoneImage.setweighting(self.weighting) self.PlotZoneImage.settimerange(self.timerange_s, self.dT_s) self.update_jitter() sfft_rate_frac = Fraction(SAMPLING_RATE, self.fft_size) / (Fraction(1) - self.overlap_frac) / 1000 self.PlotZoneImage.set_sfft_rate(sfft_rate_frac) # initialize the settings dialog self.settings_dialog = Spectrogram_Settings_Dialog(self, self.logger) self.audiobackend.underflow.connect(self.PlotZoneImage.plotImage.canvasscaledspectrogram.syncOffsets) self.last_data_time = 0. self.mustRestart = False
def __init__(self, parent, audiobackend, logger = None): QtGui.QWidget.__init__(self, parent) # store the logger instance if logger is None: self.logger = parent.parent().logger else: self.logger = logger self.parent = parent self.setObjectName("Spectrogram_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneImage = ImagePlot(self, self.logger, audiobackend) #self.PlotZoneImage = GLRollingCanvasWidget(self, self.logger) self.PlotZoneImage.setObjectName("PlotZoneImage") self.gridLayout.addWidget(self.PlotZoneImage, 0, 1, 1, 1) self.audiobuffer = None self.audiobackend = audiobackend # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE*32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.update_weighting() self.freq = self.proc.get_freq_scale() self.timerange_s = DEFAULT_TIMERANGE self.canvas_width = 100. self.old_index = 0 self.overlap = 3./4. self.overlap_frac = Fraction(3, 4) self.dT_s = self.fft_size*(1. - self.overlap)/float(SAMPLING_RATE) self.PlotZoneImage.setlog10freqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneImage.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneImage.setspecrange(self.spec_min, self.spec_max) self.PlotZoneImage.setweighting(self.weighting) self.PlotZoneImage.settimerange(self.timerange_s, self.dT_s) sfft_rate_frac = Fraction(SAMPLING_RATE, self.fft_size)/(Fraction(1) - self.overlap_frac)/1000 self.PlotZoneImage.set_sfft_rate(sfft_rate_frac) # initialize the settings dialog self.settings_dialog = Spectrogram_Settings_Dialog(self, self.logger)
def __init__(self, parent, logger=PrintLogger()): super().__init__(parent) self.logger = logger self.setObjectName(self.name) self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneSpect = SpectrumPlotWidget(self, self.logger) self.PlotZoneSpect.setObjectName("PlotZoneSpect") self.gridLayout.addWidget(self.PlotZoneSpect, 0, 0, 1, 1) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2 ** DEFAULT_FFT_SIZE * 32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.dual_channels = False self.response_time = DEFAULT_RESPONSE_TIME self.spectrum_type = "Power" # DEFAULT_SPECTRUM_TYPE = 2 self.is_dB = True # DEFAULT_INTENSITY_SCALE = 0 self.update_weighting() self.freq = self.proc.get_freq_scale() self.overlap = 3. / 4. self.data_buffer = RingBuffer(1, 4 * self.fft_size) self.smoothing_buffer = RingBuffer(1, self.fft_size*self.overlap) self.update_display_buffers() # set kernel and parameters for the smoothing filter self.setresponsetime(self.response_time) self.PlotZoneSpect.setlogfreqscale() # DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneSpect.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneSpect.setspecrange(self.spec_min, self.spec_max) self.PlotZoneSpect.setweighting(self.weighting) self.PlotZoneSpect.set_peaks_enabled(False) self.PlotZoneSpect.set_baseline_displayUnits(0.) self.PlotZoneSpect.setShowFreqLabel(DEFAULT_SHOW_FREQ_LABELS) # initialize the settings dialog self.settings_dialog = Spectrum_Settings_Dialog(self, self.logger)
def __init__(self, parent, sharedGLWidget, logger = PrintLogger()): QtGui.QWidget.__init__(self, parent) self.logger = logger self.audiobuffer = None self.setObjectName("Spectrum_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") #self.PlotZoneSpect = SpectPlot(self, self.logger) self.PlotZoneSpect = GLPlotWidget(self, sharedGLWidget, self.logger) self.PlotZoneSpect.setObjectName("PlotZoneSpect") self.gridLayout.addWidget(self.PlotZoneSpect, 0, 0, 1, 1) self.setStyleSheet(STYLESHEET) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE*32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.dual_channels = False self.response_time = DEFAULT_RESPONSE_TIME self.update_weighting() self.freq = self.proc.get_freq_scale() self.old_index = 0 self.overlap = 3./4. self.update_display_buffers() # set kernel and parameters for the smoothing filter self.setresponsetime(self.response_time) self.PlotZoneSpect.setlogfreqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneSpect.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneSpect.setspecrange(self.spec_min, self.spec_max) self.PlotZoneSpect.setweighting(self.weighting) self.PlotZoneSpect.set_peaks_enabled(True) self.PlotZoneSpect.set_baseline_displayUnits(0.) self.PlotZoneSpect.setShowFreqLabel(DEFAULT_SHOW_FREQ_LABELS) # initialize the settings dialog self.settings_dialog = Spectrum_Settings_Dialog(self, self.logger)
def __init__(self, parent, sharedGLWidget, logger=PrintLogger()): super().__init__(parent) self.logger = logger self.audiobuffer = None self.setObjectName("Spectrum_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneSpect = SpectrumPlotWidget(self, sharedGLWidget, self.logger) self.PlotZoneSpect.setObjectName("PlotZoneSpect") self.gridLayout.addWidget(self.PlotZoneSpect, 0, 0, 1, 1) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE * 32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.dual_channels = False self.response_time = DEFAULT_RESPONSE_TIME self.update_weighting() self.freq = self.proc.get_freq_scale() self.old_index = 0 self.overlap = 3. / 4. self.update_display_buffers() # set kernel and parameters for the smoothing filter self.setresponsetime(self.response_time) self.PlotZoneSpect.setlogfreqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneSpect.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneSpect.setspecrange(self.spec_min, self.spec_max) self.PlotZoneSpect.setweighting(self.weighting) self.PlotZoneSpect.set_peaks_enabled(True) self.PlotZoneSpect.set_baseline_displayUnits(0.) self.PlotZoneSpect.setShowFreqLabel(DEFAULT_SHOW_FREQ_LABELS) # initialize the settings dialog self.settings_dialog = Spectrum_Settings_Dialog(self, self.logger)
def __init__(self, parent, logger = None): QtGui.QWidget.__init__(self, parent) # store the logger instance if logger is None: self.logger = parent.parent.logger else: self.logger = logger self.audiobuffer = None self.setObjectName("Spectrum_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") #self.PlotZoneSpect = SpectPlot(self, self.logger) self.PlotZoneSpect = GLPlotWidget(self, self.logger) self.PlotZoneSpect.setObjectName("PlotZoneSpect") self.gridLayout.addWidget(self.PlotZoneSpect, 0, 0, 1, 1) self.setStyleSheet(STYLESHEET) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.proc.set_maxfreq(self.maxfreq) self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE*32 self.proc.set_fftsize(self.fft_size) self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.dual_channels = False self.PlotZoneSpect.setlogfreqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneSpect.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneSpect.setspecrange(self.spec_min, self.spec_max) self.PlotZoneSpect.setweighting(self.weighting) self.PlotZoneSpect.set_peaks_enabled(True) self.PlotZoneSpect.set_baseline_displayUnits(0.) self.PlotZoneSpect.setShowFreqLabel(DEFAULT_SHOW_FREQ_LABELS) # initialize the settings dialog self.settings_dialog = Spectrum_Settings_Dialog(self, self.logger)
def __init__(self, parent=None): super().__init__(parent) self.setObjectName("LongLevels_Widget") self.setObjectName("Scope_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneUp = TimePlot(self) self.PlotZoneUp.setObjectName("PlotZoneUp") self.PlotZoneUp.setverticaltitle("Level (dB FS RMS)") self.PlotZoneUp.sethorizontaltitle("Time (sec)") self.PlotZoneUp.setTrackerFormatter(lambda x, y: "%.3g sec, %.3g" % (x, y)) self.level_min = DEFAULT_LEVEL_MIN self.level_max = DEFAULT_LEVEL_MAX self.PlotZoneUp.setverticalrange(self.level_min, self.level_max) self.gridLayout.addWidget(self.PlotZoneUp, 0, 0, 1, 1) self.audiobuffer = None # initialize the settings dialog self.settings_dialog = LongLevels_Settings_Dialog(self) # initialize the class instance that will do the fft self.proc = audioproc() self.level = None # 1e-30 self.level_rms = -200. self.two_channels = False self.i = 0 self.old_index = 0 #Set the initial timespan and response time self.length_seconds = DEFAULT_MAXTIME self.setresptime(DEFAULT_RESPONSE_TIME) # ringbuffer for the subsampled data self.ringbuffer = RingBuffer()
def __init__(self, parent, logger=None): QtGui.QWidget.__init__(self, parent) # store the logger instance if logger is None: self.logger = parent.parent.logger else: self.logger = logger self.audiobuffer = None self.setObjectName("Spectrum_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") #self.PlotZoneSpect = SpectPlot(self, self.logger) self.PlotZoneSpect = GLPlotWidget(self, self.logger) self.PlotZoneSpect.setObjectName("PlotZoneSpect") self.gridLayout.addWidget(self.PlotZoneSpect, 0, 0, 1, 1) self.setStyleSheet(STYLESHEET) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE * 32 self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.dual_channels = False self.PlotZoneSpect.setlogfreqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneSpect.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneSpect.setspecrange(self.spec_min, self.spec_max) self.PlotZoneSpect.setweighting(self.weighting) self.PlotZoneSpect.set_peaks_enabled(True) self.PlotZoneSpect.set_baseline_displayUnits(0.) # initialize the settings dialog self.settings_dialog = Spectrum_Settings_Dialog(self, self.logger)
def __init__(self, parent=None): super().__init__(parent) self.setObjectName("Levels_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") font = QtGui.QFont() font.setPointSize(14) font.setWeight(75) font.setBold(True) self.label_peak = QtWidgets.QLabel(self) self.label_peak.setFont(font) # QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft self.label_peak.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight) self.label_peak.setObjectName("label_peak") self.label_peak_legend = QtWidgets.QLabel(self) self.label_peak_legend.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignRight) self.label_peak_legend.setObjectName("label_peak_legend") self.label_rms = QtWidgets.QLabel(self) self.label_rms.setFont(font) self.label_rms.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight) self.label_rms.setObjectName("label_rms") self.label_rms_legend = QtWidgets.QLabel(self) self.label_rms_legend.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignRight) self.label_rms_legend.setObjectName("label_rms_legend") self.meter = qsynthMeter(self) self.meter.setStyleSheet(STYLESHEET) self.meter.setObjectName("meter") self.gridLayout.addWidget(self.label_peak, 0, 0, 1, 1) self.gridLayout.addWidget(self.label_peak_legend, 1, 0, 1, 1) self.gridLayout.addWidget(self.label_rms, 2, 0, 1, 1) self.gridLayout.addWidget(self.label_rms_legend, 3, 0, 1, 1) self.gridLayout.addWidget(self.meter, 4, 0, 1, 1) self.label_rms.setText("+00.0") self.label_peak.setText("+00.0") self.label_rms_legend.setText("dB FS\n RMS") self.label_peak_legend.setText("dB FS\n Peak") self.label_rms.setTextFormat(QtCore.Qt.PlainText) self.label_peak.setTextFormat(QtCore.Qt.PlainText) # self.label_rms.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)) # self.label_rms_legend.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)) # self.label_peak.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)) # self.label_peak_legend.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)) self.audiobuffer = None # initialize the settings dialog self.settings_dialog = Levels_Settings_Dialog(self) # initialize the class instance that will do the fft self.proc = audioproc() # time = SMOOTH_DISPLAY_TIMER_PERIOD_MS/1000. #DISPLAY # time = 0.025 #IMPULSE setting for a sound level meter # time = 0.125 #FAST setting for a sound level meter # time = 1. #SLOW setting for a sound level meter self.response_time = 0.300 # 300ms is a common value for VU meters # an exponential smoothing filter is a simple IIR filter # s_i = alpha*x_i + (1-alpha)*s_{i-1} # we compute alpha so that the n most recent samples represent 100*w percent of the output w = 0.65 n = self.response_time * SAMPLING_RATE N = 5 * n self.alpha = 1. - (1. - w)**(1. / (n + 1)) self.kernel = (1. - self.alpha)**(np.arange(0, N)[::-1]) # first channel self.level_rms = -30. self.level_max = -30. self.old_rms = 1e-30 self.old_max = 1e-30 # second channel self.level_rms_2 = -30. self.level_max_2 = -30. self.old_rms_2 = 1e-30 self.old_max_2 = 1e-30 response_time_peaks = 0.025 # 25ms for instantaneous peaks n2 = response_time_peaks / (SMOOTH_DISPLAY_TIMER_PERIOD_MS / 1000.) self.alpha2 = 1. - (1. - w)**(1. / (n2 + 1)) self.two_channels = False self.i = 0
def __init__(self, parent = None, logger = PrintLogger()): QtGui.QWidget.__init__(self, parent) self.setObjectName("Levels_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") font = QtGui.QFont() font.setPointSize(14) font.setWeight(75) font.setBold(True) self.label_peak = QtGui.QLabel(self) self.label_peak.setFont(font) #QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft self.label_peak.setAlignment(QtCore.Qt.AlignBottom|QtCore.Qt.AlignRight) self.label_peak.setObjectName("label_peak") self.label_peak_legend = QtGui.QLabel(self) self.label_peak_legend.setAlignment(QtCore.Qt.AlignTop|QtCore.Qt.AlignRight) self.label_peak_legend.setObjectName("label_peak_legend") self.label_rms = QtGui.QLabel(self) self.label_rms.setFont(font) self.label_rms.setAlignment(QtCore.Qt.AlignBottom|QtCore.Qt.AlignRight) self.label_rms.setObjectName("label_rms") self.label_rms_legend = QtGui.QLabel(self) self.label_rms_legend.setAlignment(QtCore.Qt.AlignTop|QtCore.Qt.AlignRight) self.label_rms_legend.setObjectName("label_rms_legend") self.meter = qsynthMeter(self) self.meter.setStyleSheet(STYLESHEET) self.meter.setObjectName("meter") self.gridLayout.addWidget(self.label_peak, 0, 0, 1, 1) self.gridLayout.addWidget(self.label_peak_legend, 1, 0, 1, 1) self.gridLayout.addWidget(self.label_rms, 2, 0, 1, 1) self.gridLayout.addWidget(self.label_rms_legend, 3, 0, 1, 1) self.gridLayout.addWidget(self.meter, 0, 1, 4, 1) self.label_rms.setText("-100.0") self.label_peak.setText("-100.0") self.label_rms_legend.setText("dB FS\n RMS") self.label_peak_legend.setText("dB FS\n Peak") #self.label_rms.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_rms_legend.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_peak.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_peak_legend.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) self.logger = logger self.audiobuffer = None # initialize the settings dialog self.settings_dialog = Levels_Settings_Dialog(self, self.logger) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) #time = SMOOTH_DISPLAY_TIMER_PERIOD_MS/1000. #DISPLAY #time = 0.025 #IMPULSE setting for a sound level meter #time = 0.125 #FAST setting for a sound level meter #time = 1. #SLOW setting for a sound level meter self.response_time = 0.300 #300ms is a common value for VU meters # an exponential smoothing filter is a simple IIR filter # s_i = alpha*x_i + (1-alpha)*s_{i-1} #we compute alpha so that the n most recent samples represent 100*w percent of the output w = 0.65 n = self.response_time*SAMPLING_RATE N = 4096 self.alpha = 1. - (1.-w)**(1./(n+1)) self.kernel = (1. - self.alpha)**(arange(0, N)[::-1]) # first channel self.old_rms = 1e-30 self.old_max = 1e-30 # second channel self.old_rms_2 = 1e-30 self.old_max_2 = 1e-30 response_time_peaks = 0.025 # 25ms for instantaneous peaks n2 = response_time_peaks/(SMOOTH_DISPLAY_TIMER_PERIOD_MS/1000.) self.alpha2 = 1. - (1.-w)**(1./(n2+1)) self.two_channels = False self.i = 0
def __init__(self, parent, logger = None): QtGui.QWidget.__init__(self, parent) # store the logger instance if logger is None: self.logger = parent.parent().logger else: self.logger = logger self.parent = parent self.setObjectName("Spectrogram_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneImage = ImagePlot(self, self.logger) self.PlotZoneImage.setObjectName("PlotZoneImage") self.gridLayout.addWidget(self.PlotZoneImage, 0, 1, 1, 1) self.audiobuffer = None # initialize the class instance that will do the fft self.proc = audioproc(self.logger) self.maxfreq = DEFAULT_MAXFREQ self.minfreq = DEFAULT_MINFREQ self.fft_size = 2**DEFAULT_FFT_SIZE*32 self.spec_min = DEFAULT_SPEC_MIN self.spec_max = DEFAULT_SPEC_MAX self.weighting = DEFAULT_WEIGHTING self.spectrogram_timer_time = 0. self.timerange_s = DEFAULT_TIMERANGE self.canvas_width = 100. self.PlotZoneImage.setlog10freqscale() #DEFAULT_FREQ_SCALE = 1 #log10 self.PlotZoneImage.setfreqrange(self.minfreq, self.maxfreq) self.PlotZoneImage.setspecrange(self.spec_min, self.spec_max) self.PlotZoneImage.setweighting(self.weighting) self.PlotZoneImage.settimerange(self.timerange_s) # this timer is used to update the spectrogram widget, whose update period # is fixed by the time scale and the width of the widget canvas self.timer = QtCore.QTimer() self.period_ms = SMOOTH_DISPLAY_TIMER_PERIOD_MS self.timer.setInterval(self.period_ms) # variable timing # initialize the settings dialog self.settings_dialog = Spectrogram_Settings_Dialog(self, self.logger) # timer ticks self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.timer_slot) # window resize self.connect(self.PlotZoneImage.plotImage.canvasscaledspectrogram, QtCore.SIGNAL("canvasWidthChanged"), self.canvasWidthChanged) # we do not use the display timer since we have a special one # tell the caller by setting this variable as None self.update = None self.timer_time = QtCore.QTime()
def __init__(self, parent=None, logger=None): QtGui.QWidget.__init__(self, parent) self.setObjectName("Levels_Widget") self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.label_rms = QtGui.QLabel(self) font = QtGui.QFont() font.setPointSize(14) font.setWeight(75) font.setBold(True) self.label_rms.setFont(font) self.label_rms.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing) self.label_rms.setObjectName("label_rms") self.gridLayout.addWidget(self.label_rms, 0, 0, 1, 1) self.meter = qsynthMeter(self) self.meter.setStyleSheet(STYLESHEET) self.meter.setObjectName("meter") self.gridLayout.addWidget(self.meter, 0, 1, 2, 1) self.label_peak = QtGui.QLabel(self) self.label_peak.setFont(font) self.label_peak.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft) self.label_peak.setObjectName("label_peak") self.gridLayout.addWidget(self.label_peak, 0, 2, 1, 1) self.label_rms_legend = QtGui.QLabel(self) self.label_rms_legend.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTop | QtCore.Qt.AlignTrailing) self.label_rms_legend.setObjectName("label_rms_legend") self.gridLayout.addWidget(self.label_rms_legend, 1, 0, 1, 1) self.label_peak_legend = QtGui.QLabel(self) self.label_peak_legend.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.label_peak_legend.setObjectName("label_peak_legend") self.gridLayout.addWidget(self.label_peak_legend, 1, 2, 1, 1) self.label_rms.setText("-100.0") self.label_peak.setText("-100.0") self.label_rms_legend.setText("dBFS\n RMS") self.label_peak_legend.setText("dBFS\n peak") #self.label_rms.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_rms_legend.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_peak.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) #self.label_peak_legend.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) # store the logger instance if logger is None: self.logger = parent.parent.logger else: self.logger = logger self.audiobuffer = None # initialize the settings dialog self.settings_dialog = Levels_Settings_Dialog(self, self.logger) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) #time = SMOOTH_DISPLAY_TIMER_PERIOD_MS/1000. #DISPLAY #time = 0.025 #IMPULSE setting for a sound level meter #time = 0.125 #FAST setting for a sound level meter #time = 1. #SLOW setting for a sound level meter self.response_time = 0.125 # an exponential smoothing filter is a simple IIR filter # s_i = alpha*x_i + (1-alpha)*s_{i-1} #we compute alpha so that the n most recent samples represent 100*w percent of the output w = 0.65 n = self.response_time * SAMPLING_RATE N = 4096 self.alpha = 1. - (1. - w)**(1. / (n + 1)) self.kernel = (1. - self.alpha)**(arange(0, N)[::-1]) # first channel self.old_rms = 1e-30 self.old_max = 1e-30 # second channel self.old_rms_2 = 1e-30 self.old_max_2 = 1e-30 n2 = self.response_time / (SMOOTH_DISPLAY_TIMER_PERIOD_MS / 1000.) self.alpha2 = 1. - (1. - w)**(1. / (n2 + 1)) self.two_channels = False
def __init__(self, parent=None, logger=PrintLogger()): super().__init__(parent) self.setObjectName("LongLevels_Widget") self.logger = logger self.setObjectName("Scope_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneUp = TimePlot(self, self.logger) self.PlotZoneUp.setObjectName("PlotZoneUp") self.PlotZoneUp.setverticaltitle("Level (dB FS RMS)") self.PlotZoneUp.sethorizontaltitle("Time (min)") self.PlotZoneUp.setTrackerFormatter(lambda x, y: "%.3g min, %.3g" % (x, y)) self.level_min = DEFAULT_LEVEL_MIN self.level_max = DEFAULT_LEVEL_MAX self.PlotZoneUp.setverticalrange(self.level_min, self.level_max) self.gridLayout.addWidget(self.PlotZoneUp, 0, 0, 1, 1) self.logger = logger self.audiobuffer = None # initialize the settings dialog self.settings_dialog = LongLevels_Settings_Dialog(self, self.logger) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) #self.response_time = 60. # 1 minute self.response_time = 1. # an exponential smoothing filter is a simple IIR filter # s_i = alpha*x_i + (1-alpha)*s_{i-1} # we compute alpha so that the n most recent samples represent 100*w percent of the output w = 0.65 # how many times we should decimate to end up with 100 points in the kernel self.Ndec = int(max(0, np.floor((np.log2(self.response_time * SAMPLING_RATE/100.))))) n = self.response_time * SAMPLING_RATE / 2**self.Ndec N = int(5*n) self.alpha = 1. - (1. - w) ** (1. / (n + 1)) self.kernel = (1. - self.alpha) ** (np.arange(0, N)[::-1]) self.level = None # 1e-30 self.level_rms = -200. self.two_channels = False self.i = 0 self.subsampled_sampling_rate = SAMPLING_RATE / 2 ** (self.Ndec) self.subsampler = Subsampler(self.Ndec) self.old_index = 0 self.length_seconds = 60.*10 # actually this should be linked to the pixel width of the plot area self.length_samples = self.length_seconds * self.subsampled_sampling_rate # ringbuffer for the subsampled data self.ringbuffer = RingBuffer(self.logger)
def __init__(self, parent=None, logger=PrintLogger()): super().__init__(parent) self.setObjectName("LongLevels_Widget") self.logger = logger self.setObjectName("Scope_Widget") self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.PlotZoneUp = TimePlot(self, self.logger) self.PlotZoneUp.setObjectName("PlotZoneUp") self.PlotZoneUp.setverticaltitle("Level (dB FS RMS)") self.PlotZoneUp.sethorizontaltitle("Time (min)") self.PlotZoneUp.setTrackerFormatter(lambda x, y: "%.3g min, %.3g" % (x, y)) self.level_min = DEFAULT_LEVEL_MIN self.level_max = DEFAULT_LEVEL_MAX self.PlotZoneUp.setverticalrange(self.level_min, self.level_max) self.gridLayout.addWidget(self.PlotZoneUp, 0, 0, 1, 1) self.logger = logger self.audiobuffer = None # initialize the settings dialog self.settings_dialog = LongLevels_Settings_Dialog(self, self.logger) # initialize the class instance that will do the fft self.proc = audioproc(self.logger) #self.response_time = 60. # 1 minute self.response_time = 1. # an exponential smoothing filter is a simple IIR filter # s_i = alpha*x_i + (1-alpha)*s_{i-1} # we compute alpha so that the n most recent samples represent 100*w percent of the output w = 0.65 # how many times we should decimate to end up with 100 points in the kernel self.Ndec = int( max(0, np.floor( (np.log2(self.response_time * SAMPLING_RATE / 100.))))) n = self.response_time * SAMPLING_RATE / 2**self.Ndec N = int(5 * n) self.alpha = 1. - (1. - w)**(1. / (n + 1)) self.kernel = (1. - self.alpha)**(np.arange(0, N)[::-1]) self.level = None # 1e-30 self.level_rms = -200. self.two_channels = False self.i = 0 self.subsampled_sampling_rate = SAMPLING_RATE / 2**(self.Ndec) self.subsampler = Subsampler(self.Ndec) self.old_index = 0 self.length_seconds = 60. * 10 # actually this should be linked to the pixel width of the plot area self.length_samples = self.length_seconds * self.subsampled_sampling_rate # ringbuffer for the subsampled data self.ringbuffer = RingBuffer(self.logger)