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=1MHzf_c = 1000\ \text{kHz} = 1\,\text{MHz}

  • 変調信号周波数:

    fm=1 kHzf_m = 1\ \text{kHz}


まず各信号の式

搬送波(carrier)

c(t)=Accos(2πfct)c(t) = A_c \cos(2\pi f_c t)


変調信号(message)

m(t)=cos(2πfmt)m(t) = \cos(2\pi f_m t)

(簡単のため正弦波・振幅1とします)


AM(振幅変調)の基本式

通常の AM(DSB-LC)

s(t)=Ac[1+μcos(2πfmt)]cos(2πfct)\boxed{ s(t) = A_c \left[ 1 + \mu \cos(2\pi f_m t) \right] \cos(2\pi f_c t) }

  • AcA_c:搬送波振幅
  • μ\mu:変調度(0〜1)

数値を代入すると

s(t)=Ac[1+μcos(2π1000t)]cos(2π1,000,000t)\boxed{ s(t) = A_c \left[ 1 + \mu \cos(2\pi \cdot 1000\, t) \right] \cos(2\pi \cdot 1{,}000{,}000\, t) }

これが 1000 kHz 搬送波を 1 kHz で AM 変調した変調波の式です。


中身を展開すると(重要)

積の公式を使うと:

 

s(t)=Accos(2πfct)+Acμ2[cos2π(fc+fm)t+cos2π(fcfm)t]\begin{aligned} s(t) &= A_c \cos(2\pi f_c t) \\ &\quad + \frac{A_c\mu}{2} \Big[ \cos 2\pi (f_c + f_m)t + \cos 2\pi (f_c – f_m)t \Big] \end{aligned}

👉 周波数成分は:

  • 搬送波:

    fc=1000kHzf_c = 1000\,\text{kHz}

  • 上側波帯(USB):

    1001kHz1001\,\text{kHz}

  • 下側波帯(LSB):

    999kHz999\,\text{kHz}


スペクトルのイメージ

| | |
999k 1000k 1001k [Hz]
LSB C USB

まとめ(超重要)

  • AM の基本式:

s(t)=Ac[1+μm(t)]cos(2πfct)s(t) = A_c [1 + \mu m(t)] \cos(2\pi f_c t)

  • 今回の具体式:

s(t)=Ac[1+μcos(2π1000t)]cos(2π1,000,000t)s(t) = A_c [1 + \mu \cos(2\pi·1000 t)] \cos(2\pi·1{,}000{,}000 t)

  • スペクトルは 搬送波 ± 変調周波数


次に行くと理解が一気に深まるのは👇
👉 変調度 μ > 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()

コメント