suppose that we have following signal:
Compute the RMS level of a 100-Hz sinusoid sampled at 1 kHz.
t = 0:0.001:1-0.001;
X = cos(2*pi*100*t);
it's spectrum is
plot(periodogram(X));
now if i want to to calculate magnitude of peak,i know that there is some relationship between root mean square(RMS) and amplitude for sinusoidal models,form this site
http://www.indiana.edu/~emusic/acoustics/amplitude.htm
Example: The rms of a sine wave with a hypothetical peak-to peak value of –1 to 1 will be 0.707. This can be used to extrapolate that any rms amplitude = 0.707 x peak amplitude. Peak amplitude = 1.414 x rms amplitude.
i can calculate
y=rms(X);
si does it means that peak ampltide=1.414*rms(X)?in this case i have got
y*1.414
ans =
0.9998
but why does it gives me so small number?peak is more then 45 from picture,please help me
It appears you are confusing the frequency and time domains - your plot is in the frequency domain while RMS describes the Root Mean Square value of the time domain signal.
If you plot the generated cosine signal in the time domain, you will see a cosine with an amplitude of 1. In the frequency domain (seen in your figure), the x-axis is the frequency and the y-axis is the signal energy. Thus the peak would be higher for a signal measured over longer time.
Regarding the calculation you make in the end:
y=rms(X);
Gives you the rms value of the signal (in the time domain) as y. Multiplying y by 1.414 gives you the signal amplitude (with a decimal error for rounding sqrt(2) ).
So in short I think your confusion comes from the plot being in the frequency domain and the RMS value being in the time domain. Thus the peak of the plot is not related to the RMS value.
Related
I am new to Matlab and performing signal processing. I am trying to understand what this code is doing? How and why are we determining the indexNyquist and spectrum?
spectrum = fft(Signal,k); %generate spetrum of signal with FFT to k points
indexNyquist = round(k/2+1); %vicinity of nyquist frequency
spectrum = spectrum(1:indexNyquist); %truncate spectrum to Nyquist frequency
spectrum = spectrum/(length(Signal)); %scale spectrum by number of points
spectrum(2:end) = 2 * spectrum3(2:end); %compensate for truncating negative frequencies, but not DC component
For a purely real input signal the corresponding FFT will be complex conjugate symmetric about the Nyquist frequency, so there is no useful additional information in the top N/2 bins. We can therefore just take the bottom N/2 bins and multiply their magnitude by 2 to get a (complex) spectrum with no redundancy. This spectrum represents frequencies from 0 to Nyquist (and their aliased equivalent frequencies).
Note that bin 0 (0 Hz aka DC) is purely real and does not need to be doubled, hence the comment in your Matlab code.
I'm trying to find the maximum frequency of a periodic signal in Matlab and as i know when you convert a periodic signal to the frequency spectrum you get only delta functions however i get a few curves between the produced delta functions. Here is the code :
t=[-0.02:10^-3:0.02];
s=5.*(1+cos(2*pi*10*t)).*cos(2*pi*100*t);
figure, subplot(211), plot(t,s);
y=fft(s);
subplot(212), plot(t,y);
Here is a code-snippet to help you understand how to get the frequency-spectrum using fft in matlab.
Things to remember are:
You need to decide on a sampling frequency, which should be high enough, as per the Nyquist Criterion (You need the number of samples, at least more than twice the highest frequency or else we will have aliasing). That means, fs in this example cannot be below 2 * 110. Better to have it even higher to see a have a better appearance of the signal.
For a real signal, what you want is the power-spectrum obtained as the square of the absolute of the output of the fft() function. The imaginary part, which contains the phase should contain nothing but noise. (I didn't plot the phase here, but you can do this to check for yourself.)
Finally, we need to use fftshift to shift the signal such that we get the mirrored spectrum around the zero-frequency.
The peaks would be at the correct frequencies. Now considering only the positive frequencies, as you can see, we have the largest peak at 100Hz and two further lobs around 100Hz +- 10Hz i.e. 90Hz and 110Hz.
Apparently, 110Hz is the highest frequency, in your example.
The code:
fs = 500; % sampling frequency - Should be high enough! Remember Nyquist!
t=[-.2:1/fs:.2];
s= 5.*(1+cos(2*pi*10*t)).*cos(2*pi*100*t);
figure, subplot(311), plot(t,s);
n = length(s);
y=fft(s);
f = (0:n-1)*(fs/n); % frequency range
power = abs(y).^2/n;
subplot(312), plot(f, power);
Y = fftshift(y);
fshift = (-n/2:n/2-1)*(fs/n); % zero-centered frequency range
powershift = abs(Y).^2/n;
subplot(313), plot(fshift, powershift);
The output plots:
The first plot is the signal in the time domain
The signal in the frequency domain
The shifted fft signal
Consider the following script that plots a sine wave.
t = 0:pi/100:2*pi;
y = sin(t);
plot(t,y)
grid on % Turn on grid lines for this plot
This gives me a plot of sine wave. I understand the sine wave that appears continuous, should actually be discrete (my PC cannot store infinite no. of samples of continuous signal), and the matlab plot function does some kind of interpolation to connect the dots.
So In fact I also used stem instead of plot to see the sampled values (on time axis) of sine.
Now my question is there must be some sampling frequency used here. How much is that?
The sampling interval is the time interval between two consecutive samples of your signal.
The sampling frequency means how much samples of your signal you have in a fixed time interval, and it is reciprocal to the sampling interval.
You declared:
t = 0:pi/100:2*pi;
So your sampling interval is π/100. This means that your sampling frequency is 100/π.
If you want exact units, you'll have to determine the time units for t. If t is in seconds, then your sampling frequency is 100/π Hz (1Hz = 1sec-1).
By the way, MATLAB's plot connects the sampling with straight lines, there is no additional interpolation involved.
Here is the scenario: using a spectrum analyzer i have the input values and the output values. the number of samples is 32000 and the sampling rate is 2000 samples/sec, and the input is a sine wave of 50 hz, the input is current and the output is pressure in psi.
How do i calculate the frequency response from this data using MATLAB,
using the FFT function in MATLAB.
i was able to generate a sine wave, that gives out the the magnitude and phase angles, here is the code that i used:
%FFT Analysis to calculate the frequency response for the raw data
%The FFT allows you to efficiently estimate component frequencies in data from a discrete set of values sampled at a fixed rate
% Sampling frequency(Hz)
Fs = 2000;
% Time vector of 16 second
t = 0:1/Fs:16-1;
% Create a sine wave of 50 Hz.
x = sin(2*pi*t*50);
% Use next highest power of 2 greater than or equal to length(x) to calculate FFT.
nfft = pow2(nextpow2(length(x)))
% Take fft, padding with zeros so that length(fftx) is equal to nfft
fftx = fft(x,nfft);
% Calculate the number of unique points
NumUniquePts = ceil((nfft+1)/2);
% FFT is symmetric, throw away second half
fftx = fftx(1:NumUniquePts);
% Take the magnitude of fft of x and scale the fft so that it is not a function of the length of x
mx = abs(fftx)/length(x);
% Take the square of the magnitude of fft of x.
mx = mx.^2;
% Since we dropped half the FFT, we multiply mx by 2 to keep the same energy.
% The DC component and Nyquist component, if it exists, are unique and should not be multiplied by 2.
if rem(nfft, 2) % odd nfft excludes Nyquist point
mx(2:end) = mx(2:end)*2;
else
mx(2:end -1) = mx(2:end -1)*2;
end
% This is an evenly spaced frequency vector with NumUniquePts points.
f = (0:NumUniquePts-1)*Fs/nfft;
% Generate the plot, title and labels.
subplot(211),plot(f,mx);
title('Power Spectrum of a 50Hz Sine Wave');
xlabel('Frequency (Hz)');
ylabel('Power');
% returns the phase angles, in radians, for each element of complex array fftx
phase = unwrap(angle(fftx));
PHA = phase*180/pi;
subplot(212),plot(f,PHA),title('frequency response');
xlabel('Frequency (Hz)')
ylabel('Phase (Degrees)')
grid on
i took the frequency response from the phase plot at 90 degree phase angle, is this the right way to calculate the frequency response?
how do i compare this response to the values that is obtained from the analyzer? this is a cross check to see if the analyzer logic makes sense or not.
Looks OK at first glance, but a couple of things you're missing:
you should apply a window function to the time domain data before the FFT, see e.g. http://en.wikipedia.org/wiki/Window_function for windowing in general and http://en.wikipedia.org/wiki/Hann_window for the most commonly used window function (Hann aka Hanning).
you probably want to plot log magnitude in dB rather than just raw magnitude
You should consider looking at the cpsd() function for calculating the Frequency response. The scaling and normalisation for various window functions is handled for you.
the Frequency reponse would then be
G = cpsd (output,input) / cpsd (input,input)
then take the angle() to obtain the phase difference between the input and the output.
Your code snippet does not mention what the input and output data sets are.
>> fft([1 4 66])
ans =
71.0000 -34.0000 +53.6936i -34.0000 -53.6936i
Can someone explain according the result above?
EDIT Well that's embarassing. I left out a factor of 2. Updated answer follows...
The Discrete Fourier Transform, which an FFT algorithm computes quickly, assumes the input data of length N is one period of a periodic signal. The period is 2*pi rad. The frequency of the output points is given by 2*n*pi/N rad/sec, where n is the index from 0 to N-1.
For your example, then, 71 is the value at 0 rad/sec, commonly called DC, -34+53.7i is the value at 2*pi/3 rad/sec, and its conjugate is the value at 4*pi/3 rad/sec. Note that by periodicity, 2*pi/3 rad/sec = -2*pi/3 rad/sec = 4*pi/3 rad/sec. So the second half of the spectrum can be regarded as the frequencies from -pi..0 or pi..2*pi.
If the data represents sampled data at a constant sampling rate, and you know that sampling rate, you can convert rad/sec to Hz. Let the sampling rate be deltaT. Its reciprocal is the sampling frequency Fs. Then the period is T = N*deltaT sec = 2*pi rad. 1/T gives the frequency resolution deltaF = Fs/N Hz. Therefore the frequency of the output points is n*Fs/N Hz.
This is a vector of complex numbers representing your signal in frequency domain.