Beispiel #1
0
    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()
Beispiel #2
0
    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)