ふくふくHukuhuku Inc.
EP.05STEM対象: 高1以上 12分公開: 2026-05-10

音の波を分解する:フーリエ変換で和音の正体を暴く

和音をマイクで録音 → FFTで周波数に分解 → 各音の正体を見る。高校物理「波の重ね合わせ」を実装。

#中高生#物理##FFT
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

前回(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()
ド・ミ・ソの和音をFFTで分解、3本の鋭い線(C/E/G)が立つ
和音の波形をFFTにかけると、構成音が周波数として鮮明に見える

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()
ピアノ風の音のスペクトル:基音と倍音の3本の山
基音 261.6Hz の他、523Hz・785Hz・1046Hz と倍音が並ぶ
発見

ピアノ・バイオリン・フルートで「同じド」を弾いても音色が違うのは、倍音の含まれ方が違うから。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 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp