如何将1分钟间隔的NumPy振幅数组转换为FFT可用信号?
将分钟间隔的NumPy数组转换为FFT分析用信号
你的一维NumPy数组本身就是时域信号,直接可用于FFT分析,只需补充采样频率参数并做必要预处理即可。以下是具体步骤和代码示例:
1. 明确采样频率
数据按1分钟间隔采集,因此采样频率为:
fs = 1/60 # 单位:Hz(每分钟1次采样,即每秒1/60次)
2. 预处理(推荐)
为避免FFT结果中直流分量(信号均值)的干扰,建议先去除直流分量:
import numpy as np # 示例数组(实际为数千条数据) a = np.array([5, 7, -6, 9, 0, 1, 15, -2, 8]) # 去除直流分量 signal = a - np.mean(a)
3. 执行FFT并生成幅度谱
使用numpy.fft模块完成FFT计算,同时生成对应的频率轴:
n = len(signal) # 执行FFT(输出为复数数组) fft_complex = np.fft.fft(signal) # 计算幅度谱(复数的绝对值) amplitude = np.abs(fft_complex) # 生成频率轴 freqs = np.fft.fftfreq(n, d=1/fs)
4. 提取正频率部分(可选)
FFT结果是对称的,通常只需分析正频率区间:
# 筛选正频率索引 positive_mask = freqs >= 0 positive_freqs = freqs[positive_mask] positive_amplitude = amplitude[positive_mask]
5. 幅度谱归一化(可选)
如果需要让幅度谱对应原始信号的实际振幅,可进行归一化:
# 归一化:整体除以样本数,正频率分量(除直流外)乘以2 positive_amplitude_norm = positive_amplitude / n positive_amplitude_norm[1:] *= 2
优化:针对实信号的快速FFT
因为你的信号是实数值,使用np.fft.rfft可直接得到正频率部分结果,效率更高:
# 实信号优化FFT rfft_complex = np.fft.rfft(signal) r_amplitude = np.abs(rfft_complex) r_freqs = np.fft.rfftfreq(n, d=1/fs) # 归一化 r_amplitude_norm = r_amplitude / n r_amplitude_norm[1:-1] *= 2 # 最后一个频率为Nyquist频率,无需乘2
内容的提问来源于stack exchange,提问作者Majoris
相关产品推荐
相关产品推荐

