Python 中进行信号处理的库主要有 Numpy、Scipy 和 Matplotlib。以下是20个常用的信号处理函数:1. Numpy 中的信号生成:`numpy.sin`;2. 傅里叶变换:`numpy.fft.fft`;3. 信号滤波:`scipy.signal.lfilter`;4. 频率响应可视化:`scipy.signal.freqz`;5. 自相关函数:`numpy.correlate`;6. 时域卷积:`numpy.convolve`;7. 频域卷积:`scipy.signal.convolve`;8. 快速傅里叶变换(FFT):`numpy.fft.fft`;9. 滑动窗口平均:`numpy.convolve`;10. 希尔伯特变换:`scipy.signal.hilbert`;
1. Numpy 中的信号生成:`numpy.sin`
import numpy as np
import matplotlib.pyplot as plt
# 生成正弦信号
t = np.linspace(0, 1, 1000) # 时间从0到1,采样点数为1000
frequency = 5 # 频率为5Hz
signal = np.sin(2 * np.pi * frequency * t)
# 绘制信号图像
plt.plot(t, signal)
plt.title("Sinusoidal Signal")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.show()
2. 傅里叶变换:`numpy.fft.fft`
from scipy.fft import fft
import numpy as np
import matplotlib.pyplot as plt
# 生成信号
t = np.linspace(0, 1, 1000)
frequency = 5
signal = np.sin(2 * np.pi * frequency * t)
# 进行傅里叶变换
fft_result = fft(signal)
# 绘制频谱图像
plt.plot(np.abs(fft_result))
plt.title("Frequency Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.show()
3. 信号滤波:`scipy.signal.lfilter`
from scipy.signal import lfilter
import numpy as np
import matplotlib.pyplot as plt
# 生成含噪声的信号
t = np.linspace(0, 1, 1000)
frequency = 5
signal = np.sin(2 * np.pi * frequency * t) + 0.5 * np.random.normal(size=len(t))
# 设计滤波器
b = [0.01] * 10 # 滤波器系数
a = 1
# 应用滤波器
filtered_signal = lfilter(b, a, signal)
# 绘制原始信号和滤波后的信号
plt.plot(t, signal, label='Original Signal')
plt.plot(t, filtered_signal, label='Filtered Signal')
plt.title("Signal Filtering")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
4. 频率响应可视化:`scipy.signal.freqz`
from scipy.signal import freqz
import matplotlib.pyplot as plt
# 设计滤波器
b = [0.01] * 10
a = 1
# 计算频率响应
w, h = freqz(b, a)
# 绘制频率响应曲线
plt.plot(w, 20 * np.log10(abs(h)))
plt.title("Frequency Response")
plt.xlabel("Frequency (rad/sample)")
plt.ylabel("Gain (dB)")
plt.show()
5. 自相关函数:`numpy.correlate`
import numpy as np
import matplotlib.pyplot as plt
# 生成信号
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t)
# 计算自相关函数
auto_corr = np.correlate(signal, signal, mode='full')
# 绘制自相关函数图像
plt.plot(auto_corr)
plt.title("Autocorrelation Function")
plt.xlabel("Lag")
plt.ylabel("Correlation")
plt.show()
6. 时域卷积:`numpy.convolve`
import numpy as np
import matplotlib.pyplot as plt
# 生成两个信号
signal1 = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 100))
signal2 = np.cos(2 * np.pi * 3 * np.linspace(0, 1, 100))
# 计算时域卷积
conv_result = np.convolve(signal1, signal2, mode='full')
# 绘制卷积结果
plt.plot(conv_result)
plt.title("Convolution Result")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.show()
7. 频域卷积:`scipy.signal.convolve`
from scipy.signal import convolve
import numpy as np
import matplotlib.pyplot as plt
# 生成两个信号
signal1 = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 100))
signal2 = np.cos(2 * np.pi * 3 * np.linspace(0, 1, 100))
# 计算频域卷积
conv_result = convolve(signal1, signal2, mode='full')
# 绘制卷积结果
plt.plot(conv_result)
plt.title("Convolution Result")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.show()
8. 快速傅里叶变换(FFT):`numpy.fft.fft`
import numpy as np
import matplotlib.pyplot as plt
# 生成信号
t = np.linspace(0, 1, 1000)
frequency = 5
signal = np.sin(2 * np.pi * frequency * t)
# 进行傅里叶变换
fft_result = np.fft.fft(signal)
# 绘制频谱图像
plt.plot(np.abs(fft_result))
plt.title("Frequency Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.show()
9. 滑动窗口平均:`numpy.convolve`
import numpy as np
import matplotlib.pyplot as plt
# 生成信号
t = np.linspace(0, 1, 1000)
frequency = 5
signal = np.sin(2 * np.pi * frequency * t) + 0.1 * np.random.normal(size=len(t))
# 定义平均窗口
window = np.ones(20) / 20
# 使用卷积进行滑动窗口平均
smooth_signal = np.convolve(signal, window, mode='same')
# 绘制平滑后的信号
plt.plot(t, signal, label='Original Signal')
plt.plot(t, smooth_signal, label='Smoothed Signal')
plt.title("Moving Average Smoothing")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
10. 希尔伯特变换:`scipy.signal.hilbert`
from scipy.signal import hilbert
import numpy as np
import matplotlib.pyplot as plt
# 生成信号
t = np.linspace(0, 1, 1000)
frequency = 5
signal = np.sin(2 * np.pi * frequency * t)
# 进行希尔伯特变换
analytic_signal = hilbert(signal)
# 提取包络
envelope = np.abs(analytic_signal)
# 绘制原始信号和包络
plt.plot(t, signal, label='Original Signal')
plt.plot(t, envelope, label='Envelope')
plt.title("Hilbert Transform")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.legend()
plt.show()