1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ポケモンの鳴き声とFFT

1
Posted at

✅ 1. FFT(高速フーリエ変換)

役割:音声波形を「時間領域」から「周波数領域」へ変換し、どの周波数がどれだけ含まれているかを分析する。

数式(離散フーリエ変換 DFT):

$$
X_k = \sum_{n=0}^{N-1} x_n \cdot e^{-j 2\pi kn / N}
$$

  • $x_n$:時間領域の信号(音波)
  • $X_k$:周波数領域の複素数
  • $N$:信号の長さ
  • $k$:周波数インデックス

**FFT(Fast Fourier Transform)**は、これを高速に計算するアルゴリズム。

Python実装(1次元FFT):

import numpy as np
from scipy.fft import fft

signal = np.array([...])  # 時間領域の波形
spectrum = fft(signal)

✅ 2. スペクトログラム(Spectrogram)

役割:FFTを短時間ごとにスライドして繰り返すことで、時間変化する周波数成分を可視化。

数式(STFT: 短時間フーリエ変換):

$$
X(\tau, \omega) = \sum_{n=-\infty}^{\infty} x[n] \cdot w[n - \tau] \cdot e^{-j \omega n}
$$

  • $w[n - \tau]$:窓関数(例:ハミング窓)
  • $\omega$:周波数角速度

Python(librosa):

import librosa, librosa.display
import matplotlib.pyplot as plt

y, sr = librosa.load('pikachu.wav')
S = librosa.stft(y)
librosa.display.specshow(librosa.amplitude_to_db(abs(S)), sr=sr, x_axis='time', y_axis='log')
plt.title('Spectrogram')
plt.colorbar()
plt.show()

✅ 3. MFCC(メル周波数ケプストラム係数)

役割:人間の聴覚特性に近い尺度で音色・話者特徴を抽出。

計算ステップ:

  1. 音声信号 → 窓ごとにFFT
  2. FFT → パワースペクトル(Power Spectrum)
  3. パワースペクトル → メルフィルタバンクで周波数圧縮
  4. ログスケーリング(音量感の圧縮)
  5. DCT(離散コサイン変換)で特徴抽出

数式(最終ステップ):

$$
\text{MFCC}n = \sum{m=1}^{M} \log(S_m) \cdot \cos\left[ n(m - 0.5)\pi / M \right]
$$

  • $S_m$:メルフィルタバンク出力(ログスケーリング済み)
  • $M$:フィルタ数、$n$:係数番号

Python:

mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)

✅ 4. クロマ特徴量(Chroma Feature)

役割:**音高(ピッチクラス)**の分布を表す(C, C#, D, ... B =12次元)

計算ステップ:

  1. STFTなどで周波数情報抽出
  2. 各周波数を12音階にマッピング
  3. 強度を集計して正規化

Python:

chroma = librosa.feature.chroma_stft(y=y, sr=sr)

✅ 5. Zero-Crossing Rate(ゼロ交差率)

役割:波形が0をまたぐ回数を数える ⇒ ノイズ、摩擦音、粗い音の指標。

数式:

$$
ZCR = \frac{1}{T-1} \sum_{t=1}^{T-1} \mathbb{1}{{x_t \cdot x{t-1} < 0}}
$$

  • $x_t$:時刻tの信号
  • 交差したら1、それ以外は0(インジケータ関数)

Python:

zcr = librosa.feature.zero_crossing_rate(y)

✅ 6. RMS Energy(実効値エネルギー)

役割:振幅の強さの指標。音の「強さ」や「勢い」を示す。

数式:

$$
\text{RMS} = \sqrt{ \frac{1}{N} \sum_{i=1}^{N} x_i^2 }
$$

  • $x_i$:信号の振幅値
  • $N$:サンプル数

Python:

rms = librosa.feature.rms(y=y)

🔚 まとめ(どの特徴量を使う?)

特徴量 向いてること 補足
FFT / スペクトログラム 可視化、スペクトル解析 時系列周波数構造の把握
MFCC 声質・話者の識別 音声認識・話者認識に標準的
Chroma 音階の識別、音楽系 ピカチュウの鳴き声が調性的なら有効
ZCR 粗さの判定 ノイズ検出、破裂音分析など
RMS 音の強さ 鳴き声の始まりやアクセント検出など

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?