Categories: Python

Python 以 SciPy 讀取 WAV 檔案繪製波形圖、時頻譜圖教學與範例

介紹如何在 Python 中使用 scipymatplotlib 模組讀取 wav 聲音檔案,並繪製波形圖(waveform)、頻譜圖(spectrum)與時頻譜圖(spectrogram)。

讀取 WAV 聲音檔案

若要讀取一般的 wav 聲音檔案,可以使用 scipy 模組:

from scipy.io.wavfile import read

# 讀取 WAV 檔案
rate, data = read("bubbs.wav")

讀取出來的資料包含取樣頻率(rate)與取樣資料(data)。

查看取樣頻率:

# 取樣頻率
print("Sample rate: {} Hz".format(rate))
Sample rate: 11000 Hz

查看取樣資料的類型:

# 資料類型
print("Data type: {}".format(data.dtype))
Data type: uint8

繪製波形圖

將取樣資料的前 1024 點資料取出,以 matplotlib 繪製波形圖:

import matplotlib.pyplot as plt

# 繪製前 1024 點資料的波形圖
plt.figure(figsize=(15, 5))
plt.plot(data[0:1024])
plt.show()
波形圖

繪製頻譜圖

經過傅立葉轉換之後,繪製頻譜圖(spectrum):

# 傅立葉轉換
from scipy.fftpack import fft
dataFFT = fft(data[0:1024])
dataFFTAbs = abs(dataFFT[1:512])

# 繪製頻譜圖
plt.figure(figsize=(15, 5))
plt.plot(dataFFTAbs, 'r')
plt.show()
頻譜圖

波形與時頻譜圖

將全部資料的波形圖與時頻譜圖(spectrogram)繪製在一起:

import matplotlib.pyplot as plt
import numpy as np

# 產生時間資料
time = np.arange(0, len(data)) / rate

plt.figure(figsize=(15, 5))

# 繪製波形圖
plotA = plt.subplot(211)
plotA.plot(time, data)
plotA.set_ylabel("Amplitude")
plotA.set_xlim(0, len(data) / rate)

# 繪製時頻譜圖
plotB = plt.subplot(212)
plotB.specgram(data, NFFT=1024, Fs=rate, noverlap=900)
plotB.set_ylabel("Frequency")
plotB.set_xlabel("Time")

plt.show()
波形與時頻譜圖

參考資料:StackOverflow

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago