Вибрация автомобиля оценивается с помощью быстрого преобразования Фурье в Октаве - PullRequest
1 голос
/ 09 апреля 2020

Я должен оценить вибрацию автомобиля. Для этого испытания я использовал акселерометр. Собранные данные зависят от времени.

Мне нужно преобразовать данные из временной области в частотную область с помощью БПФ. К сожалению, я не очень хорошо знаком с кодированием и FTT, однако я нашел и использовал код ниже.

Что странно для меня, что максимальная максимальная точка имеет 0 Гц. Пожалуйста, смотрите прикрепленное изображение. В любом случае, есть ли способ сделать график более очевидным? Например, вырезать серию по оси X и показать только данные с частотой ниже 200 Гц.

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 с.

1 Ответ

1 голос
/ 09 апреля 2020

Максимальная максимальная точка, на которую вы ссылаетесь, является нормальной. Без отсечки частоты начало (ближайший ноль) вашего преобразования Фурье всегда будет иметь наибольшую спектральную энергию, поскольку оно разрешает частоты дискретизации, стремящиеся к нулю, который, как вы можете себе представить, будет иметь тонну представления во временных рядах. Очевидно, что 0 Гц невозможно, поэтому вы должны выбрать нижнюю граничную частоту, которая имеет смысл в области автомобильных вибраций. Поэтому я рекомендую полосовой фильтр, который выполняет прямую и обратную фильтрацию (фильтрат) для сохранения исходного временного ряда, а затем пропускает результат через этот анализ. Я бы начал с фильтра Баттерворта и при желании поэкспериментировал бы с другими:

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

РЕДАКТИРОВАТЬ:

Я использовал т, но сигнал находится в с. Вот и все:

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')

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ:

Хорошо, я думаю, что я познакомил вас с миром фильтрации, когда я думаю, что все, что вы хотели сделать, это ограничить ось вашего БПФ. Те же аргументы для полосового фильтра выше, 1 Гц и 200 Гц. Приведенный выше код должен работать, но следующий код, вероятно, то, что вы искали изначально:

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')
...