- Frequency Vector for PSD Plot: You should define the frequency vector (freq) used in the PSD plot section. It seems you intended to use “Fv” but used “freq” instead.
- PSD Calculation: To calculate the PSD plot correctly, you need to square the magnitude of the FFT components and normalize them for a proper PSD representation.
- FFT Normalization and Scaling: Your FFT normalization and scaling are mostly correct for a single-sided spectrum but ensure this is intentionally excluding the DC and possibly the Nyquist frequency component.
creating spectra of bicycle vibration measurements
4 views (last 30 days)
Show older comments
Hi. My task is to analyze acceleration signal of bike vibrations. I have to create FFT and PSD spectra. The question is is the code i used for this task correct? Do the spectra that arise make sense?
rawdata=load('time axes modules.dat')
F_x=rawdata(:,4);
D = F_x; % Column Vector
L = numel(D); % Signal Length
Fs = 8000; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Ts = 1/Fs; % Sampling Interval (sec)
t = linspace(0, L, L)*Ts;
rms(D)
rms(D)^2
figure(1)
plot(t, D);
grid
xlabel('Time (sec)')
ylabel('Amplitude')
title('Time axe module Oś');
FTs = fft(D)/L; % Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn; % Frequency Vector
Iv = 1:length(Fv); % Index Vector
Phs = angle(FTs);
figure(2)
plot(Fv, abs(FTs(Iv))*2)
grid
xlabel('Frequency Hz)')
ylabel('Amplitude m/s^2')
figure(3)
N = length(D);
xdft = fft(D);
xdft = xdft(1:N/2+1);
plot(freq,10*log10(xdft))
grid on
title('Periodogram Using FFT')
xlabel('Frequency (Hz)')
ylabel('Power/Frequency (dB/Hz)')
0 Comments
Answers (1)
Abhinaya Kennedy
on 2 Apr 2024
Hi Bartek,
Your code for analysing the acceleration signal of bike vibrations and for creating FFT and PSD spectra is mostly correct, but there are a few improvements that could be made.
rawdata = M; % Assuming .mat file, not .dat
D = rawdata{:,4}; % This extracts the fourth column as an array if rawdata is a table;
L = numel(D); % Signal Length
Fs = 8000; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Ts = 1/Fs; % Sampling Interval (sec)
t = linspace(0, L-1, L)*Ts; % Corrected time vector to start from 0 to (L-1)*Ts
% Plotting the signal
figure(1)
plot(t, D);
grid
xlabel('Time (sec)')
ylabel('Amplitude')
title('Time Axis Module');
% FFT
FTs = fft(D)/L; % Fourier Transform
Fv = linspace(0, Fn, fix(L/2)+1); % Corrected Frequency Vector to match xdft length
Iv = 1:length(Fv); % Index Vector
% Plotting FFT
figure(2)
plot(Fv, abs(FTs(Iv))*2) % Multiplied by 2 for single-sided spectrum
grid
xlabel('Frequency (Hz)')
ylabel('Amplitude (m/s^2)')
% Calculating PSD
N = length(D);
xdft = fft(D);
xdft = xdft(1:fix(N/2)+1); % Ensure xdft is correctly sliced for odd or even N
%%Modified code snippet%%
psd = (1/(Fs*N)) * abs(xdft).^2; % Correct power spectral density calculation
psd(2:end-1) = 2*psd(2:end-1); % Adjust for single-sided spectrum
% Plotting PSD
figure(3);
plot(Fv, 10*log10(psd))
grid on
title('Power Spectral Density Using FFT')
xlabel('Frequency (Hz)')
ylabel('Power/Frequency (dB/Hz)')
Ensure that your frequency vector and normalization factors are correctly applied for both the FFT and PSD plots for accurate spectral analysis.
0 Comments
See Also
Categories
Find more on Parametric Spectral Estimation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!