1. 信号生成
在信号处理中,生成特定的信号是很有必要的,下面我们介绍一些常用的信号生成方式:
1.1 正弦信号
正弦信号可以用下面的公式表示:
import numpy as np
import matplotlib.pyplot as plt
# 正弦信号的频率
freq = 2*np.pi/10
# 正弦信号的相位
phase = np.pi/4
# 采样点数为1000
N = 1000
# 生成采样点
t = np.linspace(0, 1, N)
# 生成正弦信号
sig = np.sin(freq*t + phase)
# 显示信号
plt.plot(t, sig)
plt.xlabel('time')
plt.ylabel('signal')
plt.show()
运行上面的代码,会生成一个频率为1Hz,相位为pi/4的正弦信号。如果需要改变频率和相位,只需要修改相应的参数即可。
1.2 方波信号
方波信号可以用下面的代码生成:
# 方波信号的频率
freq = 2*np.pi/10
# 方波信号的周期
period = 2*np.pi/freq
# 采样点数为1000
N = 1000
# 生成采样点
t = np.linspace(0, 1, N)
# 生成方波信号
sig = np.where(np.mod(t, period) < period/2, 1, -1)
# 显示信号
plt.plot(t, sig)
plt.xlabel('time')
plt.ylabel('signal')
plt.show()
运行上面的代码,会生成一个频率为1Hz的方波信号。如果需要改变频率,只需要修改相应的参数即可。
1.3 矩形脉冲信号
矩形脉冲信号可以用下面的代码生成:
# 矩形脉冲信号的宽度
width = 0.1
# 采样点数为1000
N = 1000
# 生成采样点
t = np.linspace(0, 1, N)
# 生成矩形脉冲信号
sig = np.where(np.logical_and(t >= 0.4, t < 0.4+width), 1, 0)
# 显示信号
plt.plot(t, sig)
plt.xlabel('time')
plt.ylabel('signal')
plt.show()
运行上面的代码,会生成一个宽度为0.1s,起始时间为0.4s的矩形脉冲信号。如果需要改变宽度和起始时间,只需要修改相应的参数即可。
2. DFT
DFT(离散傅里叶变换)是一种将时域信号转换为频域信号的方法。下面我们介绍如何使用Python实现DFT。
假设我们有一个长度为N的离散信号x[n],我们可以使用下面的公式计算DFT:
$$X[k]=\sum_{n=0}^{N-1}x[n]e^{-i2\pi kn/N}$$
其中k为频域下标,n为时域下标。我们可以使用下面的代码实现DFT:
# 信号长度
N = 100
# 采样点数为1000
n = np.arange(N)
# 生成长度为N的正弦信号
freq = 1/10
x = np.sin(2*np.pi*freq*n)
# 计算DFT
X = np.zeros(N, dtype=np.complex)
for k in range(N):
for n in range(N):
X[k] += x[n]*np.exp(-2j*np.pi*k*n/N)
# 显示DFT结果
plt.plot(np.abs(X))
plt.xlabel('frequency')
plt.ylabel('|X[k]|')
plt.show()
运行上面的代码,会生成一个频域下标为10的正弦信号。如果需要改变信号的频率,只需要修改相应的参数即可。
2.1 快速傅里叶变换
上面介绍的DFT需要计算N*N次复数乘法,计算复杂度为O(N^2),当N增大时,计算速度会很慢。因此,人们发明了一种更快的计算DFT的方法,称为快速傅里叶变换(FFT)。
Python中,可以使用numpy中的fft函数计算FFT。下面是一个例子:
# 信号长度
N = 100
# 采样点数为1000
n = np.arange(N)
# 生成长度为N的正弦信号
freq = 1/10
x = np.sin(2*np.pi*freq*n)
# 计算FFT
X = np.fft.fft(x)
# 显示FFT结果
plt.plot(np.abs(X))
plt.xlabel('frequency')
plt.ylabel('|X[k]|')
plt.show()
运行上面的代码,会生成和前面一样的结果,但计算速度要快很多。
总结
本文介绍了几种常用的信号生成方法和DFT的Python实现方式。其中, FFT是一种高效的DFT计算方法,可以大大提高计算速度。