这四句代码是关于对电压数据(voltage)进行快速傅里叶变换(FFT),并生成相应的频率向量,提取并计算频谱的幅度,同时只保留正频率部分。
五句代码如下图所示:
% 计算采样频率
dt = mean(diff(time)); % 计算时间间隔
Fs = 1 / dt; % 采样频率
% 对电压数据进行FFT变换
Y = fft(voltage, N_fft);
% 计算频率向量
f = (0:(N_fft/2-1)) * (Fs / N_fft);
% 计算FFT的幅度
amplitude = abs(Y / N_fft);
% 只取正频率部分
amplitude = amplitude(1:N_fft/2);
1、计算采样频率
% 计算采样频率
dt = mean(diff(time)); % 计算时间间隔
Fs = 1 / dt; % 采样频率
计算采样频率 fs。采样频率是数据中时间间隔的倒数。假设你的时间间隔是恒定的(例如 0.001 秒),则:
在这个例子中,时间间隔为 0.001 秒,所以采样频率 fs = 1000 Hz。
2、对电压数据进行FFT变换
% 对电压数据进行FFT变换
Y = fft(voltage, N_fft);
“Y = fft(voltage, N_fft);”这行代码使用 MATLAB 或类似环境中的 fft 函数来对电压信号进行快速傅里叶变换 (FFT)。其作用是将时域信号转换为频域信号。
“voltage”这是输入的时域电压数据,是一个向量。它代表了电压信号随时间变化的情况。
“N_fft”这是指定的 FFT 变换的点数。即使 voltage 的长度小于或大于 N_fft,函数 fft 仍会基于 N_fft 的长度进行计算。如果 N_fft 大于 voltage 的长度,voltage 会在末尾用零填充(zero-padding),提高频率分辨率。如果 N_fft 小于 voltage 的长度,voltage 会被截断。
“fft 函数”对输入的电压信号进行 FFT,输出的是一个复数向量 Y。其中每个元素的模表示频域中对应频率的幅值,实部和虚部分别表示余弦和正弦分量,复数相位角表示相位信息。
3、计算频率向量
% 计算频率向量
f = (0:(N_fft/2-1)) * (Fs / N_fft);
“f = (0:(N_fft/2-1)) * (Fs / N_fft);”这一行代码用于生成相应的频率向量 f,表示 FFT 结果对应的频率值。
“0:(N_fft/2-1)”这部分创建了一个从 0 到 N_fft/2 - 1 的整数向量。由于 FFT 的结果是对称的(共轭对称性),我们只需要保留前一半的频率分量(通常称为正频率分量)。因此,N_fft/2 个频率分量是足够的。
“Fs”这是采样频率,表示每秒采集的样本数。它与时域数据的采样速率相关,决定了频域的范围。
“(Fs / N_fft)”这是频率分辨率,表示 FFT 结果中每个频率点之间的间隔。它等于采样频率 Fs 除以 FFT 的点数 N_fft。因此,频率向量的最小间隔就是 Fs / N_fft。
4、计算FFT的幅度
% 计算FFT的幅度
amplitude = abs(Y / N_fft);
“amplitude = abs(Y / N_fft);”这行代码计算 FFT 结果的幅度谱。
“Y”这是之前通过 fft 计算得到的复数向量,表示信号的频域信息。Y 包含了每个频率分量的复数值,其中实部和虚部分别表示信号的余弦和正弦分量。
“abs()”这是计算复数的绝对值,也就是模值。傅里叶变换的结果 Y 是一个复数值,使用 abs(Y) 可以得到每个频率分量的幅值(即信号在该频率上的能量大小)。具体来说,复数的模是通过其实部和虚部计算的:
这样,abs(Y) 就是各个频率分量的幅度。
“Y / N_fft”FFT 的结果通常需要除以 FFT 的点数 N_fft 以进行归一化。因为 fft 函数的输出幅度会放大 N_fft 倍,因此我们需要除以 N_fft,确保得到的幅度是信号的真实幅值,而不是放大后的值。通过这种归一化处理,幅度值会反映信号的实际大小。
例如:如果时域信号的幅度为 1,则通过除以 N_fft,频域中的幅度谱在能量和信号幅值上会被正确调整。
5、幅度取正频率部分
% 只取正频率部分
amplitude = amplitude(1:N_fft/2);
“amplitude = amplitude(1:N_fft/2);”这行代码只保留正频率部分的幅度谱。
“amplitude(1:N_fft/2)”这部分代码是对 amplitude 向量进行索引操作,只保留前 N_fft/2 个元素。
原因:在对信号进行 FFT 之后,频谱结果是对称的,即频率分量既有正频率部分,也有负频率部分(根据复数共轭对称性)。对于实数信号,负频率部分是冗余的,因为它与正频率部分的信息相同。
具体来说:
FFT 的结果 Y 中,前半部分(从索引 1 到 N_fft/2)对应正频率;
后半部分(从索引 N_fft/2 + 1 到 N_fft)则对应负频率。
因为我们只关心信号的正频率部分,所以通过 amplitude(1:N_fft/2),我们只保留正频率的幅度谱。
6、总结
通过 fft(voltage, N_fft),我们得到了频域的复数信号 Y。
通过 f = (0:(N_fft/2-1)) * (Fs / N_fft),我们得到了频率向量 f,用于与 Y 对应的频率值。这个频率向量只表示前一半的频率,因为傅里叶变换的结果是对称的,我们只关心正频率部分。
通过 amplitude = abs(Y / N_fft)`,我们得到经过归一化处理的 FFT 结果的幅度谱,表示信号在不同频率上的能量分布。
通过 amplitude = amplitude(1:N_fft/2),只保留正频率部分的幅度,因为对于实数信号,负频率部分是对称的,不需要重复保留。