質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

周波数解析から平均を求めたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,434

score 39

音声ファイルの周波数を解析し、平均と全体の分散を求めたいのですが、正しい平均の求め方がわかりません。
現在は周波数*振幅の平均を取る形で行なっているのですが、正しいのでしょうか?

sound = AudioSegment.from_file(audio_path, format='mp3')

# 情報の取得
time = sound.duration_seconds # 再生時間(秒)
rate = sound.frame_rate  # サンプリングレート(Hz)
channel = sound.channels # チャンネル:mono(1)/stereo(2)


# 曲の最初4秒を切り取る
stime=0
etime=seg_point_list[0]*4+4

sound1 = sound[stime*1000:etime*1000]
sound1.export("tmp.wav", format="wav")


data,rate = librosa.load('tmp.wav')


#(振幅)の配列を作成
data = data / 32768

##### 周波数成分を表示する #####
#縦軸:dataを高速フーリエ変換する(時間領域から周波数領域に変換する)
fft_data = np.abs(np.fft.fft(data))    
#横軸:周波数の取得  #np.fft.fftfreq(データ点数, サンプリング周期)
freqList = np.fft.fftfreq(data.shape[0], d=1.0/rate)  
#データプロット
plt.plot(freqList, fft_data)
plt.xlim(0, 8000) #0~8000Hzまで表示
plt.show()


positive_freq = freqList[:44100]
positive_fft = fft_data[:44100]


mean = statistics.mean(positive_freq*positive_fft)
mean
#OUT:0.16214748943907212


また現在ほとんど鳴っていない周波数域の値も利用しているのですが、閾値を設けて鳴っている周波数のみを利用した方がよろしいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • jeanbiego

    2019/12/09 13:02

    何のためにその処理をしたいかによるのではないでしょうか。
    普通に平均というと振幅の合計値を周波数ポイントで割るのではないでしょうか。振幅に周波数を掛けるのは、そういう重み付けが必要な場合だけと思います。
    周波数は、可聴域とかMP3帯域とか目的によって制限するか、サンプリング周波数によって制限されるか。

    いずれにせよ、プログラミングの質問ではないような気がするのですが…

    キャンセル

  • sezaki_H

    2019/12/09 13:24

    なるほど・・・単純にこの音声内の音が平均して高いのか低いのかを出したいだけなのですが、間違ってはいないのでしょうか。。。

    すいません、手法の質問でした。気をつけます。

    キャンセル

  • jeanbiego

    2019/12/09 14:58

    ・データ内の音の高低を知りたいのでしたら、「周波数×振幅」というだけでは不足しています。
    大きい音声データ「周波数(低)×振幅(大)」と、高い音声データ「周波数(高)×振幅(小)」が区別できないからです。ですので、「Σ(周波数×振幅)/Σ(振幅)」とやるか、振幅の合計値が1になるように規格化してあげてから「周波数×振幅」の平均とるかいずれかでやった方が適切です。
    ・あと、フォーマットがMP3のようなので、少なくとも16 kHz以上は要らないのではないでしょうか。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る