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")
Esempio n. 2
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()
Esempio n. 3
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)
Esempio n. 4
0
## 演算系モジュール
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