使用窗函数从 FFT 结果中提取某些频率

问题描述 投票:0回答:1

我正在尝试使用 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');
matlab fft
1个回答
0
投票

不,你有几个错误。 以下是一些关于前进的提示:

  1. 运行代码后,通过查看您创建的每行变量的维度进行检查,例如

    windowed_segment

  2. 阅读内置的

    fftshift
    ,看看您是否需要使用它。

  3. 一维 fft 的频率向量有正频率和负频率,看看如何纠正它。如果您注意到偶数或奇数可能略有不同(例如,如果 N=1023 或 N=1024),请加分。

© www.soinside.com 2019 - 2024. All rights reserved.