signal-processing - 通过 Octave 快速傅立叶变换评估汽车振动

标签 signal-processing fft octave vibration

我必须评估汽车的振动。在这次试验中,我使用了加速度计。收集的数据取决于时间。

我需要通过FFT将数据从时域转换到频域。不幸的是,我不太熟悉编码和 FTT,但是我找到并使用了下面的代码。

对我来说奇怪的是,最大高点为 0Hz。请参阅附图。 无论如何,有没有办法让图表更明显?例如,在x轴切出一个系列,只显示200Hz以下的数据。

enter image description here

clc
A=xlsread('50_dirt_road.xlsx');
t=A(:,9);
s=A(:,8);
Ts = mean(diff(t));                                     % Sampling Interval
Fs = 1/Ts;                                              % Sampling Frequency
Fn = Fs/2;                                              % Nyquist Frequency
L = numel(t);                                           % Signal Length
sm = s - mean(s);                                       % Mean-Corrected Signal (Eliminates 0 Hz Offset)
FTs = fft(sm)/L;                                        % Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn;                     % Frequency Vector
Iv = 1:numel(Fv);                                       % Index Vector
[MaxV,idx] = max(abs(FTs(Iv))*2);                       % Maximum V & Index
Freq = Fv(idx);                                         % Frequency Of Maximum V
figure
plot(Fv, abs(FTs(Iv))*2)
grid
text(Freq, MaxV, sprintf('\\leftarrow %.4f G, %.0f Hz', MaxV, Freq), 'HorizontalAlignment','left')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

请您仔细检查一下好吗?我的变量定义如下:

  • s:测量的“G”值。总共3395个测量值。

  • t:时间。每个值在0.001秒后记录,总共3.395秒。

最佳答案

您所说的最高点是正常的。如果没有频率截止,傅里叶变换的开始(最接近零)将始终具有最大的频谱能量,因为它正在解析趋向于零的采样率,正如您可以想象的那样,这将在时间序列中具有大量的表示形式。显然 0 Hz 是不可能的,因此您应该选择在汽车振动领域有意义的下限频率。因此,我推荐使用带通滤波器,它可以进行前向和后向滤波(filt filt)以保留原始时间序列,然后通过此分析运行结果。如果需要,我会从巴特沃斯滤波器开始,并尝试其他滤波器:

https://octave.sourceforge.io/signal/function/butter.html

编辑:

我使用的是 t,但信号在 s 中。这是整个事情:

clc
A=xlsread('50_dirt_road.xlsx');
t=A(:,9);
s=A(:,8);
Ts = mean(diff(t));                                     % Sampling Interval
Fs = 1/Ts;                                              % Sampling Frequency
Fn = Fs/2;                                              % Nyquist Frequency
L = numel(t);                                           % Signal Length

%1st order butterworth filter with a band pass of 1hz to 200hz in radians
%forward and reverse filtered
[b,a] = butter(1, [1/(L/2), 200/(L/2)]);
filtered_s = filtfilt(b,a,s);

sm = filtered_s - mean(filtered_s);                     % Mean-Corrected Signal (Eliminates 0 Hz Offset)
FTs = fft(sm)/L;                                        % Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn;                     % Frequency Vector
Iv = 1:numel(Fv);                                       % Index Vector
[MaxV,idx] = max(abs(FTs(Iv))*2);                       % Maximum V & Index
Freq = Fv(idx);                                         % Frequency Of Maximum V
figure
plot(Fv, abs(FTs(Iv))*2)
grid
text(Freq, MaxV, sprintf('\\leftarrow %.4f G, %.0f Hz', MaxV, Freq), 'HorizontalAlignment','left')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

最后编辑:

好吧,我想我已经向您介绍了过滤的世界,而我认为您所要做的就是限制 FFT 的轴。上面的带通滤波器的参数相同,1hz 和 200hz。上面的代码应该可以工作,但以下代码可能正是您最初寻找的代码:

clc
A=xlsread('50_dirt_road.xlsx');
t=A(:,9);
s=A(:,8);
Ts = mean(diff(t));                                     % Sampling Interval
Fs = 1/Ts;                                              % Sampling Frequency
Fn = Fs/2;                                              % Nyquist Frequency
L = numel(t);                                           % Signal Length

sm = s - mean(s);                     % Mean-Corrected Signal (Eliminates 0 Hz Offset)
FTs = fft(sm)/L;                                        % Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn;                     % Frequency Vector
freqMask = (Fv > 1) & (Fv < 200);
Fv = Fv(freqMask);
FTs = FTs(freqMask);
Iv = 1:numel(Fv);                                       % Index Vector
[MaxV,idx] = max(abs(FTs(Iv))*2);                       % Maximum V & Index
Freq = Fv(idx);                                         % Frequency Of Maximum V
figure
plot(Fv, abs(FTs(Iv))*2)
grid
text(Freq, MaxV, sprintf('\\leftarrow %.4f G, %.0f Hz', MaxV, Freq), 'HorizontalAlignment','left')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

关于signal-processing - 通过 Octave 快速傅立叶变换评估汽车振动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61123700/

相关文章:

matlab - 生成 16 QAM 信号

matlab - 将通带信号转换为基带等效模型以降低采样率和样本数

python - 如何应用傅立叶变换来提取图像中某些边缘的频率?

c++ - 如何在 Cuda 中从 2D 实数到复数 FFT 获取所有数据

audio - 音符发作检测

c++ - 数据压缩算法

python - FFT - 滤波 - 逆 FFT - 剩余偏移

python - 使用一维 bool 数组进行 Numpy 索引

scripting - Octave 脚本部分

octave - 破管问题