Simulink and FFT function
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hi to all,
I hope to be able to find a solution for my problem.
I'm using Simulink to perform data analysis on accelerations along the Z-axis coming from a accelerometer at a sampling rate of 160 Hz. I would like to calculate the FFT over 1600 samples (so, every 10 seconds) during a real-time acquisition and so I'm using this diagram:
I would like to make the stats block output the four maximum peaks from the FFT. In Matlab, the code works very well since I'm able to obtain every time four maximum peaks and their frequencies, but when I use this same code in the stats blocks I get different results.
The code I use in Matlab is:
figure(2)
N = length(raw_accelearation(start*10:stop*10));
xdft = fft(raw_accelearation(start*10:stop*10));
xdft = xdft(1:floor(N/2+1));
psdx = (1/(Fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(raw_accelearation(start*10:stop*10)):Fs/2;
L = length(psdx);
windowed_signal=psdx.*hamming(L);
plot(freq,10*log10(windowed_signal))
grid on
title('Periodogram for asphalt')
xlabel('Frequency (Hz)')
ylabel('Power/Frequency (dB/Hz)')
[maxpeaks, idx] = findpeaks(10*log10(psdx),'MinPeakDistance',500,'NPeaks',4,'MinPeakHeight',-10)
peak1 = maxpeaks(1)
freq1 = freq(idx(1))
peak2 = maxpeaks(2)
freq2 = freq(idx(2))
peak3 = maxpeaks(3)
freq3 = freq(idx(3))
peak4 = maxpeaks(4)
freq4 = freq(idx(4))
and this is the plot:
This is the code I use in the stats block in Simulink:
function [x,y, z]= stats(u)
coder.extrinsic('findpeaks');
y=10;
x=10;
z=10;
Fs=160;
raw_acceleration = u;
N = length(raw_acceleration);
xdft = fft(raw_acceleration);
xdft = xdft(1:floor(N/2+1));
psdx = (1/(Fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(raw_acceleration):Fs/2;
% plot(freq,10*log10(psdx))
% grid on
% title('Periodogram for asphalt')
% xlabel('Frequency (Hz)')
% ylabel('Power/Frequency (dB/Hz)')
[maxpeaks, idx] = findpeaks(10*log10(psdx),'MinPeakDistance',300,'NPeaks',4,'MinPeakHeight',mean(10*log10(psdx)))
peak1 = maxpeaks(1)
% freq1 = freq(idx(1))
peak2 = maxpeaks(2)
% freq2 = freq(idx(2))
% peak3 = maxpeaks(3)
% freq3 = freq(idx(3))
% peak4 = maxpeaks(4)
% freq4 = freq(idx(4))
y = peak2
x = peak1
z = length(maxpeaks)
end
The problems in Simulink are:
- I can't output all the four peaks because the code is able to find only 3 peaks
- If I increase the MinPeakDistance I get an error: Index exceeds matrix dimensions.
How can I solve the problems?
This is how I setup the buffer block and the window block.
Antworten (0)
Siehe auch
Kategorien
Mehr zu Circuit Envelope Simulation finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!