def __init__(self, parent=None, filepath=None): QGraphicsItem.__init__(self, parent) self.setFlags(QGraphicsItem.ItemIsMovable) self.audio_manager = AudioManager(filepath) self.flg_ballname_hidden = FLG_BALLNAME_HIDE self.flg_ballname_index = SPLIT_NAME_INDEX self.play_volume = 1 self.play_ch = DEF_CHANNEL # グラフのフォントサイズ self.font_size = FONT_SIZE # ファイル名を格納 root, ext = os.path.splitext(filepath) self.file_name = os.path.basename(root) # ToolTip self.setToolTip(u"fifi")
def analysis(self): # TODO: 解析結果を格納する構造体をどうするか? # TODO: Flaskを使っているとき、辞書型でGlobal変数を作っていた from FiSig.AudioManager import AudioManager from scipy import hanning from FiSig.gwt import gwt import time self.Result = Struct() self.Result.wave = None # オーディオファイルのロード # [data, fs] = wavread(self.wavfilepath) am = AudioManager(self.wavfilepath) fs = am.getFs() data = am.getData() self.Result.fs = fs self.Result.wave.data_raw = data ############################################ # wave ############################################ # DEBUG: データが長いと面倒なので、0.5sだけ抜き出す if len(data) > fs / 2: data = data[0:fs / 2 - 1] N = len(data) self.Result.wave.data = data ############################################ # STFT ############################################ fftLen = 512 win = hanning(fftLen) step = fftLen / 2 spectrogram = abs(stft(data, win, step)[:, :fftLen / 2 + 1]).T spectrogram = 20 * np.log10(spectrogram) ############################################ # GWT ############################################ # GWTは解析時間が長いので、解析時間を表示 self.statusBar().showMessage("GWT running ..", 5000) # 時間計測開始 start = time.time() # GWT解析を実行する d_gwt, trange, frange = gwt(data, Fs=fs) d_gwt = 20 * np.log10(np.abs(d_gwt)) extent = trange[0], trange[-1], frange[0], frange[-1] # 解析終了と、解析時間を表示する self.statusBar().showMessage( "GWT fin ... analys time %0.2f[s]" % (time.time() - start), 10000) fontsize = 10 # ***************************** # オーディオファイルのプロット # ***************************** self.ax1.cla() # グラフのプロット self.ax1.plot(data) # 上限値選択ウィジェットの実行 ls1 = AxisLimitSelector2D(data, self.fig1, self.ax1, self.ax1_sub) # 軸の設定 # self.fig1.tight_layout() self.ax1.set_xlabel('Time [s]', fontsize=fontsize) self.ax1.set_ylabel('Amplitude [-]]', fontsize=fontsize) self.ax1.locator_params(nbins=10, axis='x', tight=None) self.ax1.locator_params(nbins=3, axis='y', tight=None) self.canvas1.draw() # ***************************** # STFT # ***************************** self.ax2.cla() # STFT結果の表示 self.ax2.imshow(spectrogram, origin="lower", aspect="auto", cmap="jet") # 上限値選択ウィジェットの実行 ls2 = AxisLimitSelector3D(spectrogram, self.fig2, self.ax2, self.ax2_sub) # 軸の設定 # self.fig2.tight_layout() self.ax2.set_xlabel('Time [s]', fontsize=fontsize) self.ax2.set_ylabel('Frequency [Hz]', fontsize=fontsize) self.ax2.locator_params(nbins=10, axis='x', tight=None) self.ax2.locator_params(nbins=3, axis='y', tight=None) self.canvas2.draw() # ***************************** # GWT # ***************************** self.ax3.cla() # GWT結果は間引く gdata = d_gwt[::10, ::10] # STFT結果の表示 im = self.ax3.imshow(np.flipud(gdata.T), cmap='jet', extent=extent) # 上限値選択ウィジェットの実行 self.selector3.setData(d_gwt, "3D") # 軸の設定 self.ax3.axis('auto') self.ax3.set_title('Scarogram (GWT)', fontsize=fontsize) self.ax3.title.set_visible(False) self.ax3.set_xlabel('Time [s]', fontsize=fontsize) self.ax3.set_ylabel('Frequency [Hz]', fontsize=fontsize) self.ax3.locator_params(nbins=10, axis='x', tight=None) self.ax3.locator_params(nbins=3, axis='y', tight=None) self.canvas3.draw()
def analys(self): import time from scipy import hanning from FiSig.gwt import gwt from FiSig.stft import stft self.statusbar.showMessage("analysing ..", 5000) # -- progress bar -- self.progressBar.setVisible(True) self.progressBar.setValue(10) # オーディオファイルのロード am = AudioManager(self.abspath) fs = am.getFs() data = am.getData() # --- データを格納 --- self.fs = fs ############################################ # wave ############################################ # DEBUG: データが長いと面倒なので、0.5sだけ抜き出す if len(data) >= fs / 2: data = data[0:fs / 2 - 1] N = len(data) # --- データを格納 --- self.wave_d = data # -- progress bar -- self.progressBar.setValue(30) ############################################ # STFT ############################################ # fftLen = 512 # win = hanning(fftLen) # step = fftLen / 2 # spectrogram = abs(stft(data, win, step)[:, : fftLen / 2 + 1]).T # spectrogram = 20 * np.log10(spectrogram) # # # --- データを格納 --- # self.spec_d = spectrogram # -- progress bar -- self.progressBar.setValue(60) ############################################ # GWT ############################################ # GWTは解析時間が長いので、解析時間を表示 # self.statusbar.showMessage("GWT running ..", 5000) # 時間計測開始 # start = time.time() # GWT解析を実行する d_gwt, trange, frange = gwt(data, Fs=fs) d_gwt = 20 * np.log10(np.abs(d_gwt)) extent = trange[0], trange[-1], frange[0], frange[-1] # -- progress bar -- self.progressBar.setValue(80) # --- データを格納 --- self.gwt_d = d_gwt self.gwt_trange = trange self.gwt_frange = frange self.gwt_extent = extent # 解析終了と、解析時間を表示する # self.statusbar.showMessage("GWT fin ... analys time %0.2f[s]" % (time.time() - start), 10000) # -- progress bar -- self.progressBar.setValue(100) self.progressBar.setVisible(False)
## 演算系モジュール import numpy as np ## GUIモジュール from MasterOfMainWindow import MasterOfMainWindow from UI_SignalAnalyser_a01 import Ui_MainWindow ## FiSigモジュール from FiSig.AudioManager import AudioManager ## uiファイル名 uiFile = 'UI_SignalAnalyser_a01.ui' ## グローバル変数 audio_manager = AudioManager() # ============================================================================= ## GUIの構築 class GUI(MasterOfMainWindow, Ui_MainWindow): def __init__(self, parent=None): MasterOfMainWindow.__init__(self) Ui_MainWindow.__init__(self) self.setupUi(self) # ==================================== # ステータスバーにプログラスバーを追加 # (qtDesignerでの作り方がわからない) # ==================================== self.progressBar = QProgressBar()
class OneShotItem(QGraphicsItem): ITEM_WIDTH = 40 ITEM_HEIGHT = ITEM_WIDTH def __init__(self, parent=None, filepath=None): QGraphicsItem.__init__(self, parent) self.setFlags(QGraphicsItem.ItemIsMovable) self.audio_manager = AudioManager(filepath) self.flg_ballname_hidden = FLG_BALLNAME_HIDE self.flg_ballname_index = SPLIT_NAME_INDEX self.play_volume = 1 self.play_ch = DEF_CHANNEL # グラフのフォントサイズ self.font_size = FONT_SIZE # ファイル名を格納 root, ext = os.path.splitext(filepath) self.file_name = os.path.basename(root) # ToolTip self.setToolTip(u"fifi") def paint(self, painter, option, widget): """ ワンショットItemの描画 """ # ペンの設定 font_size = 2.5 painter.setPen(QPen(QColor("brown"), 2.5)) painter.setBrush(QBrush(Qt.white, Qt.SolidPattern)) # 円の描画 painter.drawEllipse(-self.ITEM_WIDTH / 2, -self.ITEM_HEIGHT / 2, self.ITEM_WIDTH, self.ITEM_HEIGHT) # ファイル名の描画 if not self.flg_ballname_hidden: name = self.file_name text_ = [n.split("-") for n in name.split("_")] parsed_name = [] for names in text_: for name in names: parsed_name.append(name) text = parsed_name[self.flg_ballname_index] # text_ = self.file_name.split("_") # text = text_.split("-")[self.flg_ballname_index] painter.setFont(QFont(FONT_MEIRIO, self.font_size)) painter.drawText(-self.ITEM_WIDTH / 2, -self.ITEM_HEIGHT / 2, self.ITEM_WIDTH, self.ITEM_HEIGHT, Qt.AlignCenter | Qt.AlignCenter, unicode('%s' % text)) def boundingRect(self, *args, **kwargs): """ ワンショットItemの外形の返却 ※ 再描画用だと思う """ penWidth = 20.0 return QRectF(-self.ITEM_WIDTH / 2 - penWidth / 2, -self.ITEM_HEIGHT / 2 - penWidth / 2, self.ITEM_WIDTH + penWidth, self.ITEM_HEIGHT + penWidth) def mousePressEvent(self, event): """ マウスクリック動作イベント """ # 継承クラスのメソッドを実行 QGraphicsItem.mousePressEvent(self, event) # 右クリックでオーディオ再生 if event.button() is Qt.RightButton: # オーディオを再生 self.audio_manager.play(volume=self.play_volume, channel=self.play_ch) @Slot() def set_play_volume(self, volume): self.play_volume = volume @Slot() def set_play_channel(self, ch): self.play_ch = ch