我正在尝试使用 MATLAB(R2022b Update 7)并提出一个代码来从 fft 结果中提取某些频率。我有 1 Hz 数据(三天 259200 秒),希望将时间序列信息转换为频域。使用的窗口大小为 1024,窗口函数为汉明。分析窗口的移动没有任何重叠。从 FFT 结果中提取频率约为 0.01 Hz (0.007–0.013 Hz) 的数据,并根据 3 天(259200 秒)的时间序列数据(x 轴)进行绘制。
这是我到目前为止所拥有的,如果我是否走在正确的轨道上,我需要进一步的指导。如有任何帮助,我们将不胜感激。
% time series data
data = randn(1, 3*24*60*60); % 3 days of data sampled at 1 Hz
t1 = datetime(2013,11,1,0,0,0);
t2 = datetime(2013,11,3,23,59,59);
t = t1:seconds(1):t2;
N = 1024; % window size
window = hamming(N); % window function
% Pre-allocate output
output = zeros(length(data), 1);
% Perform FFT for each window and pick up the data at around 0.01 Hz
for i = 1:N:length(data)-N+1
segment = data(i:i+N-1);
windowed_segment = segment .* window;
fft_result = abs(fft(windowed_segment));
% Assuming the sampling rate is 1 Hz
freq = (0:N-1)/N; % frequency axis
% Find the index of the frequency around 0.01 Hz
[~, idx] = min(abs(freq - 0.01));
% Pick up the data at the frequency around 0.01 Hz
output(i:i+N-1) = fft_result(idx);
end
% Plot the result against time
time = (0:length(data)-1) / (60*60*24); % convert seconds to days
plot(t, output);
xlabel('Time');
ylabel('Amplitude at 0.01 Hz');
不,你有几个错误。 以下是一些关于前进的提示:
运行代码后,通过查看您创建的每行变量的维度进行检查,例如
windowed_segment
。
阅读内置的
fftshift
,看看您是否需要使用它。
一维 fft 的频率向量有正频率和负频率,看看如何纠正它。如果您注意到偶数或奇数可能略有不同(例如,如果 N=1023 或 N=1024),请加分。