Contents
NumPyにはFFTは用意されていますか?

はい、用意されています 👍
NumPy には FFT(高速フーリエ変換) が標準で入っています。
NumPy の FFT
NumPy では numpy.fft モジュールとして提供されています。
import numpy as np
基本中の基本
1次元 FFT
X = np.fft.fft(x)
-
x:時間領域の信号 -
X:周波数領域(複素数)
逆 FFT
x_rec = np.fft.ifft(X)
周波数軸もセットで使う(重要)
N = len(x)
dt = 0.001 # サンプリング間隔(秒)freq = np.fft.fftfreq(N, d=dt)実用的な最小例(サイン波)
import numpy as np
import matplotlib.pyplot as plt
# 時間軸
fs = 1000 # サンプリング周波数 [Hz]
t = np.linspace(0, 1, fs, endpoint=False)
# 信号(50Hz の sin 波)
x = np.sin(2 * np.pi * 50 * t)
# FFT
X = np.fft.fft(x)
freq = np.fft.fftfreq(len(x), d=1/fs)
# 振幅スペクトル
amp = np.abs(X)
plt.plot(freq, amp)
plt.xlim(0, 200)
plt.grid()
plt.show()
👉 50Hz にピークが立ちます。

よく使う FFT 関数まとめ
| 関数 | 内容 |
|---|---|
np.fft.fft |
1次元 FFT |
np.fft.ifft |
逆 FFT |
np.fft.fftfreq |
周波数軸 |
np.fft.fftshift |
0Hz を中央へ |
np.fft.rfft |
実数信号用 FFT |
np.fft.irfft |
実数信号用逆 FFT |
NumPy FFT の位置づけ
-
✔ 標準で使える
-
✔ 学習・可視化・簡単な解析に最適
-
△ 超大規模・高速処理は
scipy.fftが有利
まとめ
-
NumPy に FFT は標準搭載
-
np.fft.fft()で即使える -
周波数軸(
fftfreq)とセットが鉄板
もし目的が
-
音声解析
-
ノイズ除去
-
スペクトル解析
なら、次は 実データでのFFT手順まで一気にいけますよ。
1000kHzの搬送波に1kHzの周波数をAM変調した変調波の式はどうなりますか?
いいテーマですね。では 式としてきちんと書きます 👍
(通信工学のど真ん中です)
条件の整理
-
搬送波周波数:
fc=1000 kHz=1MHz
-
変調信号周波数:
fm=1 kHz
まず各信号の式
搬送波(carrier)
c(t)=Accos(2πfct)
変調信号(message)
m(t)=cos(2πfmt)
(簡単のため正弦波・振幅1とします)
AM(振幅変調)の基本式
通常の AM(DSB-LC) は
s(t)=Ac[1+μcos(2πfmt)]cos(2πfct)
- Ac:搬送波振幅
- μ:変調度(0〜1)
数値を代入すると
s(t)=Ac[1+μcos(2π⋅1000t)]cos(2π⋅1,000,000t)
これが 1000 kHz 搬送波を 1 kHz で AM 変調した変調波の式です。
中身を展開すると(重要)
積の公式を使うと:
s(t)=Accos(2πfct)+2Acμ[cos2π(fc+fm)t+cos2π(fc−fm)t]
👉 周波数成分は:
-
搬送波:
fc=1000kHz
-
上側波帯(USB):
1001kHz
-
下側波帯(LSB):
999kHz
スペクトルのイメージ
| | |
999k 1000k 1001k [Hz]
LSB C USB
まとめ(超重要)
-
AM の基本式:
s(t)=Ac[1+μm(t)]cos(2πfct)
-
今回の具体式:
s(t)=Ac[1+μcos(2π⋅1000t)]cos(2π⋅1,000,000t)
-
スペクトルは 搬送波 ± 変調周波数
次に行くと理解が一気に深まるのは👇
👉 変調度 μ > 1 で何が起きるか(過変調)
👉 DSB-SC(搬送波抑圧)との式の違い
👉 これを NumPy で波形&FFT表示
どれいきます?
これを NumPy で波形&FFT表示
了解です 👍
では その AM 変調波を NumPy で作って、波形と FFT を表示します。
通信系の教科書そのままの流れでいきますね。
① 条件設定(今回の問題そのまま)
-
搬送波:1000 kHz = 1 MHz
-
変調波:1 kHz
-
変調度:μ = 0.5(過変調を避ける)
※ FFT を正しく見るため サンプリング周波数は十分高くします。
② NumPy で AM 変調波を生成
import numpy as np
import matplotlib.pyplot as plt
# パラメータ
fc = 1_000_000 # 搬送波周波数 [Hz]
fm = 1_000 # 変調波周波数 [Hz]
mu = 0.5 # 変調度
Ac = 1.0 # 搬送波振幅
fs = 20_000_000 # サンプリング周波数 [Hz]
T = 2e-3 # 観測時間 [s](2 ms)
t = np.arange(0, T, 1/fs)
# AM変調波
s = Ac * (1 + mu * np.cos(2*np.pi*fm*t)) * np.cos(2*np.pi*fc*t)
③ 時間波形を表示(拡大して見る)
plt.figure()
plt.plot(t[:2000], s[:2000]) # 最初の一部だけ表示
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")
plt.title("AM waveform (time domain)")
plt.grid()
plt.show()
👉
-
中の細かい波:1 MHz 搬送波
-
包絡線:1 kHz の cos 波
これが AM 変調の本質です。
④ FFT(周波数スペクトル)
# FFT
S = np.fft.fft(s)
freq = np.fft.fftfreq(len(S), d=1/fs)
# 振幅スペクトル
amp = np.abs(S) / len(S)
plt.figure()
plt.plot(freq, amp)
plt.xlim(990_000, 1_010_000) # 搬送波付近を拡大
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.title("AM spectrum (FFT)")
plt.grid()
plt.show()
⑤ 見えるはずの周波数成分
グラフには 3本のピークが立ちます:
| 成分 | 周波数 |
|---|---|
| 下側波帯(LSB) | 999 kHz |
| 搬送波 | 1000 kHz |
| 上側波帯(USB) | 1001 kHz |
👉 数式で導いた結果と FFT が一致します。
⑥ 超重要ポイント(実務・試験)
-
サンプリング周波数
fsは
少なくとも搬送波の 10倍以上 -
観測時間
Tが短すぎると
→ 周波数分解能が悪化 -
FFT は 必ず freq 軸とセット
まとめ
-
NumPy で AM 波形は式どおり生成できる
-
FFT を取ると
fc ± fm に側波帯が現れる -
時間領域 ⇔ 周波数領域がつながる瞬間 ✨
次におすすめなのは
👉 μ を 1.2 にして過変調を確認
👉 DSB-SC(搬送波なし)との比較
👉 包絡線検波を NumPy で再現
どれ行きます?
AM変調のFFT表示プログラム
プログラム
import numpy as np
import matplotlib.pyplot as plt
# パラメータ
fc = 1_000_000 # 搬送波周波数 [Hz]
fm = 1_000 # 変調波周波数 [Hz]
mu = 0.5 # 変調度
Ac = 1.0 # 搬送波振幅
fs = 20_000_000 # サンプリング周波数 [Hz]
T = 2e-3 # 観測時間 [s](2 ms)
t = np.arange(0, T, 1/fs)
# AM変調波
s = Ac * (1 + mu * np.cos(2*np.pi*fm*t)) * np.cos(2*np.pi*fc*t)
# FFT
S = np.fft.fft(s)
freq = np.fft.fftfreq(len(S), d=1/fs)
# 振幅スペクトル
amp = np.abs(S) / len(S)
plt.figure()
plt.plot(freq, amp)
plt.xlim(990_000, 1_010_000) # 搬送波付近を拡大
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.title("AM spectrum (FFT)")
plt.grid()
plt.show()



コメント