频率检波(Frequency Detection)是一种用于检测信号中特定频率成分的技术。以下是几种常见的频率检波方法:
1. 傅里叶变换(Fourier Transform)
傅里叶变换是一种将信号从时域转换到频域的方法。通过傅里叶变换,可以将信号分解为不同频率的正弦波和余弦波。
```python import numpy as np import matplotlib.pyplot as plt
生成信号
fs = 1000 # 采样频率 t = np.linspace(0, 1, fs, endpoint=False) f1 = 50 # 信号频率 f2 = 120 # 信号频率 signal = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t)
傅里叶变换
Y = np.fft.fft(signal) f = fs * np.fft.fftfreq(len(signal), d=1/fs)
绘制频谱图
plt.plot(f[:len(f)//2], np.abs(Y[:len(Y)//2])) plt.xlabel('Frequency (Hz)') plt.ylabel('Amplitude') plt.title('Fourier Transform') plt.show() ```
2. 自相关法(Autocorrelation)
自相关法是通过计算信号的自相关函数来检测特定频率成分的方法。自相关函数可以揭示信号在不同时间延迟下的相似性。
```python import numpy as np import matplotlib.pyplot as plt
生成信号
fs = 1000 # 采样频率 t = np.linspace(0, 1, fs, endpoint=False) f1 = 50 # 信号频率 f2 = 120 # 信号频率 signal = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t)
计算自相关函数
autocorr = np.correlate(signal, signal, mode='full') autocorr = autocorr[len(autocorr)//2:]
找到自相关函数的峰值
peaks, _ = find_peaks(autocorr, height=0.5)
绘制自相关函数图
plt.plot(t, signal) plt.plot(peaks, autocorr[peaks], 'ro') plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Autocorrelation Function') plt.show() ```
3. 窄带滤波法(Narrowband Filtering)
窄带滤波法是通过设计一个特定带宽的滤波器来检测信号中的特定频率成分。滤波器的带宽应等于或小于所需检测的频率分辨率。
```python import numpy as np import matplotlib.pyplot as plt
生成信号
fs = 1000 # 采样频率 t = np.linspace(0, 1, fs, endpoint=False) f1 = 50 # 信号频率 f2 = 120 # 信号频率 signal = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t)
设计窄带滤波器
nyquist = fs // 2 low_pass = np.zeros_like(signal) high_pass = np.zeros_like(signal) low_pass[f1 - nyquist: f1 + nyquist] = 1 high_pass[f2 - nyquist: f2 + nyquist] = 1
应用滤波器
filtered_signal = low_pass * signal + high_pass * signal
绘制信号图
plt.plot(t, signal, label='Original Signal') plt.plot(t, filtered_signal, label='Filtered Signal', color='red') plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Narrowband Filtering') plt.legend() plt.show() ```
4. 移动平均法(Moving Average)
移动平均法是一种简单的频率检测方法,通过计算信号在一定时间窗口内的平均值来检测特定频率成分。
```python import numpy as np import matplotlib.pyplot as plt
生成信号
fs = 1000 # 采样频率 t = np.linspace(0, 1, fs, endpoint=False) f1 = 50 # 信号频率 f2 = 120 # 信号频率 signal = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t)
设定移动平均窗口大小
window_size = 100 moving_avg = np.convolve(signal, np.ones(window_size)/window_size, mode='same')
绘制信号图和移动平均图
plt.figure(figsize=(12, 6)) plt.subplot(2, 1, 1) plt.plot(t, signal, label='Original Signal') plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Original Signal') plt.legend()
plt.subplot(2, 1, 2) plt.plot(t, moving_avg, label='Moving Average', color='red') plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Moving Average') plt.legend()
plt.tight_layout() plt.show() ```
这些方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。