前回(EP.02)で「和音は3つの sin の足し算」と学びました。今回は逆方向、和音から3つの周波数を取り出す「」を体験します。これは音楽だけでなく、画像処理・通信・地震解析など、あらゆる科学技術の基礎です。
Step 1: 単音を作る → FFT で確認
440Hz の sin → FFT
Python
import numpy as npimport matplotlib.pyplot as plt
sample_rate = 44100duration = 1.0freq = 440 # ラ
t = np.linspace(0, duration, int(sample_rate * duration), False)wave = np.sin(2 * np.pi * freq * t)
# FFT 実行fft = np.fft.fft(wave)freqs = np.fft.fftfreq(len(wave), 1/sample_rate)# 正の周波数だけ取り出すhalf = len(freqs) // 2plt.figure(figsize=(10, 4))plt.subplot(1, 2, 1); plt.plot(t[:1000], wave[:1000]); plt.title("時間波形"); plt.xlabel("時間 (秒)")plt.subplot(1, 2, 2); plt.plot(freqs[:half], np.abs(fft[:half])); plt.xlim(0, 1000); plt.title("周波数スペクトル"); plt.xlabel("周波数 (Hz)")plt.tight_layout(); plt.show()結果
右側のスペクトルで 440Hz のところに鋭い線が立つ。それ以外はほぼゼロ。「sin 一発 = 周波数1個」が見えます。
Step 2: 和音をFFTで分解する
ド・ミ・ソ → 3本の線
Python
import numpy as npimport matplotlib.pyplot as plt
sample_rate = 44100duration = 1.0t = np.linspace(0, duration, int(sample_rate * duration), False)
# 和音freqs = [261.63, 329.63, 392.00]chord = sum(np.sin(2 * np.pi * f * t) for f in freqs)
fft = np.fft.fft(chord)fft_freqs = np.fft.fftfreq(len(chord), 1/sample_rate)half = len(fft_freqs) // 2
plt.figure(figsize=(10, 4))plt.plot(fft_freqs[:half], np.abs(fft[:half]))plt.xlim(0, 600)plt.xlabel("周波数 (Hz)")plt.ylabel("強度")plt.title("ド・ミ・ソ の和音スペクトル")plt.grid(True)plt.show()
3本の鋭い線が立ちます:261.6Hz(ド)、329.6Hz(ミ)、392.0Hz(ソ)。FFTが「重ね合わさった音から元の周波数を抽出」する魔法を見せてくれます。
Step 3: 楽器の倍音構造
実は、ピアノやギターのドの音は、261.6Hz の sin だけではない。倍音(2倍、3倍、4倍...の周波数)が混ざっています。これが「楽器の音色の違い」の正体。
倍音を含む「ド」の音を作る
Python
import numpy as npimport matplotlib.pyplot as plt
sample_rate = 44100duration = 1.0t = np.linspace(0, duration, int(sample_rate * duration), False)
f0 = 261.63# 基音 + 倍音(2倍、3倍、4倍、5倍)の重ね合わせwave = ( 1.0 * np.sin(2 * np.pi * f0 * t) + 0.5 * np.sin(2 * np.pi * 2 * f0 * t) + 0.3 * np.sin(2 * np.pi * 3 * f0 * t) + 0.2 * np.sin(2 * np.pi * 4 * f0 * t))
# FFT で見るfft = np.fft.fft(wave)freqs = np.fft.fftfreq(len(wave), 1/sample_rate)half = len(freqs) // 2plt.figure(figsize=(10, 4))plt.plot(freqs[:half], np.abs(fft[:half]))plt.xlim(0, 1500); plt.xlabel("周波数 (Hz)"); plt.title("倍音構造")plt.show()
発見
ピアノ・バイオリン・フルートで「同じド」を弾いても音色が違うのは、倍音の含まれ方が違うから。FFT で倍音の構造を見ると、楽器の個性が分かります。
Step 4: 自由研究 — 自分の声をFFT
wav ファイルを にアップロードしてFFTで分析するコード:
wav ファイルからFFT
Python
from scipy.io import wavfileimport numpy as npimport matplotlib.pyplot as plt
# Colab にアップロードした my_voice.wav を読むsr, audio = wavfile.read("my_voice.wav")if audio.ndim > 1: audio = audio.mean(axis=1) # ステレオならモノラル化
fft = np.fft.fft(audio[:sr]) # 最初の1秒freqs = np.fft.fftfreq(sr, 1/sr)half = sr // 2plt.figure(figsize=(12, 4))plt.plot(freqs[:half], np.abs(fft[:half]))plt.xlim(0, 4000)plt.title("自分の声のスペクトル")plt.show()次回予告
EP.06 は探究学習。公開データを使った自分のテーマでデータ分析。仮説 → 検証 → 発表まで、研究プロセスを通します。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。