📜  导出频谱 (1)

📅  最后修改于: 2023-12-03 15:09:30.492000             🧑  作者: Mango

导出频谱

在数字信号处理中,频谱是一种表示信号在频率域上的分布特性的图像。在音频、图像、视频等领域,频谱分析是非常常见的操作。本文将向程序员介绍如何使用Python导出频谱。

导入相关库

为了导出频谱,我们需要借助几个Python库:

  • numpy: 用于数值计算和数组操作。
  • scipy: 用于科学计算,包括信号处理和频谱分析。
  • matplotlib: 用于绘制图形。
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
生成样本信号

为了演示如何导出频谱,我们首先生成一个简单的样本信号。

fs = 1000                   # 采样频率
t = np.arange(0, 1, 1/fs)   # 时间轴
f1, f2, f3 = 50, 120, 300  # 三个正弦波的频率 
s1 = np.sin(2*np.pi*f1*t)   # 第一个正弦波
s2 = 0.5 * np.sin(2*np.pi*f2*t)   # 第二个正弦波
s3 = 0.2 * np.sin(2*np.pi*f3*t)   # 第三个正弦波
s = s1 + s2 + s3           # 合成的信号

这里生成了一个采样频率为1000Hz的信号,其中包含三个不同频率的正弦波,最后将三个信号相加得到一个合成的信号S

绘制时域波形

在导出频谱之前,为了快速看出信号的特点,我们需要先绘制时域波形。

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(t, s)
ax.set_xlabel('Time(s)')
ax.set_ylabel('Amplitude')
ax.set_title('Sample Signal in Time Domain')
plt.show()

运行上述代码,我们得到如下时域波形图:

Sample Signal in Time Domain

使用快速傅里叶变换(FFT)得到频谱

快速傅里叶变换(FFT)是一种高效的算法,用于将信号从时间域转换为频域。以下代码展示了如何使用FFT来获取样本信号的频谱。

n = len(s)  # 信号长度
k = np.arange(n)
T = n / fs
freq = k / T   # 频率轴,单位为Hz
freq = freq[:n//2]  # 取一半范围
S = np.fft.fft(s) / n  # FFT变换
S = S[:n//2]    # 取一半范围
  • n:信号的长度。
  • k:FFT返回的频谱是对信号进行的傅里叶变换结果,频率范围为0Hz到Nyquist频率。k是一个与n相同长度的数组,用于表示每个单元都有哪个频率。
  • T:用于将傅里叶频谱的线性轴(k)转换为频率轴(freq)上的Hz值。
  • freq: 频率轴,即傅里叶变换后的频率范围。
  • S:FFT变换后,我们得到的频域信号范围也为0Hz到Nyquist频率。我们将FFT变换后的结果除以n,得到的是幅度值,并保留到由k定义的一半频率范围内。

现在,我们可以绘制频谱了。

绘制频域波形
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(freq, np.abs(S))
ax.set_xlabel('Frequency(Hz)')
ax.set_ylabel('Magnitude')
ax.set_title('Sample Signal in Frequency Domain')
plt.show()

运行上述脚本,我们得到如下频域波形图:

Sample Signal in Frequency Domain

导出频谱数据

为了更进一步地分析频谱,我们可能需要将频谱数据导出到外部文件。以下代码展示了如何将频谱数据导出到CSV文件中。

# 将freq和S沿列方向合并成一个数组,并转置
data = np.column_stack((freq, np.abs(S)))
# 将数据写入CSV文件
np.savetxt("spectral_data.csv", data, delimiter=",", header="frequency,magnitude", comments="")

这将会生成一个名为spectral_data.csv的文件,里面包含了频率和幅度数据。

总结

本文向程序员介绍了如何使用Python导出频谱。我们使用FFT将时域信号转换为频域信号,并使用Matplotlib绘制了频域波形图。最后,我们展示了如何将频谱数据保存在CSV文件中。感谢阅读!