信号处理是指对信号进行采集、变换、分析和解释的技术与方法,旨在提取有用信息或改善信号质量。信号可以是模拟的(连续时间)或数字的(离散时间),常见的信号包括声音、图像、生物信号(如心电图)、雷达信号等。
信号处理的主要任务包括:
- 滤波:去除噪声或干扰,保留感兴趣的频率成分。
- 变换:如傅里叶变换(FFT)、小波变换,将信号从时域转换到频域以便分析。
- 调制与解调:用于通信系统中信号的传输。
- 压缩:减少数据量,便于存储或传输。
- 特征提取:在模式识别和机器学习中用于分类或检测。
常用的工具和技术包括:
- 数字滤波器设计(FIR、IIR)
- 快速傅里叶变换(FFT)
- 卷积与相关运算
- 自适应滤波
- 时频分析(如短时傅里叶变换、小波分析)
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
from scipy.signal import butter, filtfilt
# 示例:对含噪信号进行FFT分析和低通滤波
def signal_processing_example():
# 生成带噪声的信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False)
signal_clean = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 120 * t)
signal_noisy = signal_clean + 1.5 * np.random.normal(size=t.shape)
# FFT 分析
N = len(t)
yf = fft(signal_noisy)
xf = fftfreq(N, 1/fs)[:N//2]
# 绘制频谱
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.title("Signal Frequency Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
# 设计低通滤波器并应用
def lowpass_filter(data, cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return filtfilt(b, a, data)
filtered_signal = lowpass_filter(signal_noisy, cutoff=80, fs=fs)
# 绘制原始、含噪和滤波后信号
plt.subplot(2, 1, 2)
plt.plot(t, signal_noisy, label='Noisy Signal')
plt.plot(t, filtered_signal, label='Filtered Signal', linewidth=2)
plt.plot(t, signal_clean, '--', label='Clean Signal', alpha=0.7)
plt.legend()
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.title("Noise Removal using Low-pass Filter")
plt.tight_layout()
plt.show()
# 调用示例函数(取消注释以运行)
# signal_processing_example()
傅里叶变换在信号处理中的作用是将一个时域信号转换为频域表示,从而揭示信号中包含的频率成分。通过这种变换,可以分析信号的频谱特性,识别出信号中的不同频率分量及其强度。这在滤波、调制解调、噪声去除、音频处理、图像压缩(如JPEG)、通信系统设计等领域具有关键作用。例如,在音频处理中,傅里叶变换可以帮助我们识别声音中的基频和谐波;在通信中,它用于将信号从时域转换到频域以便进行频分复用。
import numpy as np
import matplotlib.pyplot as plt
# 示例:对一个含噪的正弦信号进行傅里叶变换
Fs = 1000 # 采样频率
T = 1/Fs # 采样周期
L = 1000 # 信号长度
t = np.arange(0, L) * T
# 生成信号:两个频率的正弦波叠加(50Hz 和 120Hz)加噪声
f1, f2 = 50, 120
x = 0.7 * np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t) + 0.5 * np.random.randn(L)
# 快速傅里叶变换(FFT)
X = np.fft.fft(x)
P2 = np.abs(X / L) # 双边谱
P1 = P2[:L // 2 + 1]
P1[1:-1] *= 2
f = Fs * np.arange(0, L // 2 + 1) / L
# 绘图
plt.figure(figsize=(10, 4))
plt.plot(f, P1)
plt.title('单边幅度谱(通过FFT)')
plt.xlabel('频率 (Hz)')
plt.ylabel('|P1(f)|')
plt.grid()
plt.show()



被折叠的 条评论
为什么被折叠?



