【问题标题】:Car vibration evaluated by Fast Fourier Transform in Octave通过 Octave 中的快速傅里叶变换评估汽车振动
【发布时间】:2020-04-12 08:43:51
【问题描述】:

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

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

对我来说奇怪的是,最大高点为 0Hz。请看附图。 无论如何,有没有办法让图表更明显?例如,在 x 轴上截取一个系列,只显示 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
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.001s后记录,共3.395s。

【问题讨论】:

  • 我看到你之前放了一个链接,但我太忙了,没时间查看。如果你把它放上来,我可以把数据拉下来,看看我能不能让它工作,然后我会分享脚本

标签: signal-processing fft octave vibration


【解决方案1】:

您所指的最大高点是正常的。在没有频率截止的情况下,傅立叶变换的开始(最接近零)将始终具有最大的频谱能量,因为它正在解析趋向于零的采样率,正如您可以想象的那样,在时间序列中会有大量的表示。显然 0 赫兹是不可能的,因此您应该选择在汽车振动领域有意义的下限频率。所以我推荐一个带通滤波器,它会进行正向和反向滤波(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')

【讨论】:

  • 嗨,我尝试过同样的方法,但是 Octave 仍然告诉我与[b,a] = butter(4, [Fn*2*pi), 200*2*pi]); 行相关的语法错误我有什么遗漏吗?例如另一个包?此时,我使用 IO & Signal pkg。提前谢谢你。
  • 很抱歉出现语法错误。我删除了它现在是:[b,a] = butter(4, [Fn*2*pi, 200*2*pi]);
  • 我可以识别出有一个额外的括号。不幸的是,代码无法正常工作,原因是:error: butter" W(1) must be less than W(2) & error: called from butter at line 111 column 7, test at line 12 column 7 我已经检查了奈奎斯特频率理论,但是,我没有做错什么。
  • 好的,抱歉我又犯了一个错误,因为我没有运行数据。如果采样率为 0.001 秒,则奈奎斯特频率将为 500hz,即高于 200 hz。我更改了解释并将代码更改为 1 hz 到 200 hz,您应该选择对汽车振动域有意义的较低截止频率,但现在我只选择 1 hz 来帮助您入门。如果现在可行,请告诉我。
  • 不幸的是,由于以下原因,代码仍然无法正常工作:错误:黄油:Wc 的所有元素必须在 [0,1] 范围内,错误:在第 166 行列从黄油调用5,最迟在第 12 行第 7 列。
猜你喜欢
  • 2011-07-12
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2013-03-31
  • 2020-03-29
  • 2017-09-14
  • 2019-04-25
相关资源
最近更新 更多