Area of a Spectrum

What matlab command can give me the area of a spectrum. I have shock response spectrum but i need to find the area under the curve.

 Risposta accettata

Dr. Seis
Dr. Seis il 1 Ago 2012

0 voti

The area under your curve should just be:
N = numel(x);
dt = 1/fs;
df = fs/N;
y = fft(x)*dt;
area_y = sum(abs(y))*df; % which is also equal to: sum(abs(fft(x)))/N
energy_y = sum(abs(y).^2)*df;
If you really want "energy", then energy_y should be equal to energy_x:
energy_x = sum(x.^2)*dt;

4 Commenti

Lisa Justin
Lisa Justin il 1 Ago 2012
Modificato: Lisa Justin il 1 Ago 2012
Thanks. Is this what you mean?
N = numel(x);
dt = 1/fs;
df = fs/N;
[y,f] = srs(x,fs,fmin,fmax,fno,Q,Nw);
area_y = sum(abs(y))*df;
Lisa Justin
Lisa Justin il 1 Ago 2012
freq range is between 10 to 800
Dr. Seis
Dr. Seis il 1 Ago 2012
Modificato: Dr. Seis il 1 Ago 2012
Yeah... in your case, you would just need:
area_y = sum(abs(y))/N;
The frequency increment ( df ) comes into play only if you scaled your FFT amplitudes ( y ) by the time increment ( dt ) - since dt*df = 1/ N. If you do not scale your FFT amplitudes inside your srs function, then you should just divide your sum by N to get the area. If you want to find the area between a frequency range, you will have to do something a little different. See below:
Example:
N = 4096;
fs = 2000;
x = randn(1,N);
df = fs/N;
Nyq = fs/2;
y = fft(x);
f = ifftshift(-Nyq : df : Nyq-df);
If your y represents both the negative and positive frequency amplitudes:
area_y_10_800 = sum(abs(y( abs(f) >= 10 & abs(f) <= 800 )))/N;
or if your y represents only the positive frequencies
area_y_10_800 = 2*sum(abs(y( f >= 10 & f <= 800 )))/N;
However, you do not want to double the amount if you are including either your 0 frequency or Nyquist frequency amplitude in the frequency range.
Lisa Justin
Lisa Justin il 2 Ago 2012
Thanks.

Accedi per commentare.

Più risposte (1)

Wayne King
Wayne King il 1 Ago 2012

1 voto

Hi Lisa, If you have the Signal Processing Toolbox, you can use the avgpower() method of a spectrum object.
For example:
Fs = 1000;
t = 0:1/Fs:1-(1/Fs);
x = cos(2*pi*50*t)+sin(2*pi*100*t)+randn(size(t));
psdest = psd(spectrum.periodogram,x,'Fs',Fs,'NFFT',length(x));
avgpower(psdest,[25 75])
The final line above integrates under the PSD from 25 to 75 Hz.
Note you can get the fraction of the total power in the specified interval with:
avgpower(psdest,[25 75])/avgpower(psdest)

1 Commento

Lisa Justin
Lisa Justin il 1 Ago 2012
Thanks Wayne. But it is like this: I calculated the shock response spectrum Y and plotted between frequencies 10-500. I need the peaks and the area under the curve max(Y) gives me the peak and i tried area(Y) and i get a shaded plot again but what i really want is the value of the area of Y.

Accedi per commentare.

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by