Matlab Code To Estimate The Power Spectrum of The EEG Signal

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 5

close all; clear all; clc;

fs = 3000 % fs
Sampling frequency, positive scalar. Sampling frequency, specifie
d as a positive scalar. The sampling frequency is the number of samples per unit
time. If the unit of time is seconds, the sampling frequency has units of hertz
.
T = 1/fs;% sampling rate or frequency
load('J:\BIOM_Signal_processing\Hw9\EEGsignal_1') % contains eeg1 and fs
N =length(eeg1); ls = size(eeg1); % find the length of the data per second
tx =[0:length(eeg1)-1]/fs;% Make time axis for EEG signal
figure; subplot (211), plot(tx,eeg1); xlabel('Time (s)'), ylabel('Amplitude (mV)
'), title('Original EEG signal'); %EEG waveform
subplot(212), plot(tx,eeg1);
%fignum = fignum + 1; figure(fignum);
xlabel('Time (s)'), ylabel('Amplitude (mV)'), title('Zoom into original EEG sign
al at 1 to 2 seconds'), xlim([1,2]) % Used to zoom in on single ECG waveform
figure;
NFFT = 2 ^ nextpow2(N); %% number points. Number of DFT points, specified as a
positive integer. For a real-valued input signal, x, the PSD estimate, pxx has l
ength (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd. For a compl
ex-valued input signal,x, the PSD estimate always has length nfft. If nfft is sp
ecified as empty, the default nfft is used.
Y = fft(eeg1, NFFT)/N; %% fft of the EEG signals
f = (fs/2 * linspace(0,1,NFFT/2+1))'; % Vector containing frequencies in Hz
amp =( 2 * abs(Y(1: NFFT/2+1))); % Vector containing corresponding amplitudes
subplot(2,1,1), plot (f, amp);title ('plot single-sided amplitude spectrume of t
he EEG signal'); xlabel ('frequency (Hz)'); ylabel ('|y(f)|');grid on;
%Estimate the power spectrum of the 10-s epoch by computing the periodogram
%the plot using periodogram with no outputs.
periodogram_1 = periodogram(eeg1);
subplot(2,1,2), plot (f,periodogram_1);title('Periodogram power spectral Densist
y Estimate of the EEG signal'); xlabel ('frequency (Hz)');ylabel ('Power/Frequen
cy(dB)');grid on;
%%% plot the periodogram with the length of EEG signal
nfft= length(eeg1);
periodogram_2 =periodogram(eeg1,[],nfft);
f1 = (fs/2 * linspace(0,1,nfft/2+1))'; % Vector containing frequencies in Hz
figure;
subplot(2,2,1), plot(f1,periodogram_2);title('Periodogram power spectral Densist
y Estimate of the EEG signal and length of EGG signal'); xlabel('frequency (Hz)'
);ylabel('Power/Frequency(dB)');grid on;
%%%%The signal is 30001 samples in length. Obtain the periodogram using the defa
ult rectangular window and DFT length. The DFT length is the next power of two g
reater than the signal length, or 32768 points.
%Because the signal is real-valued and has even length, the periodogram is one-s
ided and there are 512/2+1 points.
[pxx,w] = periodogram(eeg1);
subplot(2,2,2), plot(w,10*log10(pxx)); title ('Periodogram using the default rec
tangular window and DFT length'); xlabel ('frequency(Hz)'); ylabel ('Power/Frequ
ency(dB)');grid on;
%%Modified Periodogram with Hamming Window. Obtain the modified periodogram of a
n input EEG signal with no noise. The signal is 30001 samples in length. Obtain
the modified periodogram using a Hamming window and default DFT length. The DFT
length is the next power of two greater than the signal length, or 32786 points
.
%Because the signal is real-valued and has even length, the periodogram is one-s
ided and there are 32768/2+1 points.
hamming_1=periodogram(eeg1,hamming(length(eeg1)));
subplot(2,2,3), plot (f,hamming_1);title ('Periodogram using the hamming window

and DFT length'); xlabel ('frequency(Hz)'); ylabel ('PSD estimate/Power/Frequenc


y(dB) ');grid on;
%DC-Centered Periodogram
%Obtain the periodogram of EEG signal. The data are sampled at 3000 kHz. Use the
'centered' option to obtain the DC-centered periodogram and plot the result.
[periodogram_center, fcenter]= periodogram(eeg1,[],length(eeg1),fs,'centered');
subplot(2,2,4), plot(fcenter,periodogram_center); title ('Periodogram using DC-C
entered and DFT length'); xlabel ('frequency(Hz)'); ylabel ('Power/Frequency(dB)
');grid on;
%Change the window size for each periodogram, using 3 or 4 values of your
%own choosing. An example might be: 100 sample windows, 200 samples, 1000 sample
s, and 2000 samples.
%use example from this link: http://www.mathworks.com/help/signal/ref/periodogra
m.html
%pxx = periodogram(x,window) returns the modified periodogram PSD estimate using
the window, window. window is a vector the same length as x.
%% use from this link: http://www.mathworks.com/matlabcentral/answers/73055-haii-am-new-to-matlab-how-to-divide-a-eeg-signal-into-frames-in-matlab
%eeg_100= eeg1(1:100,1); %% create the data sample from 0 to 100 sample from col
umn 1.
eeg_100= eeg1(1:101); %% create the data sample from 0 to 100 sample from column
1.
nfft_100 = length(eeg_100);
[pxx_100,w1] = periodogram(eeg_100);
figure;
subplot(3,2,1), plot(w1,10*log10(pxx_100)); title ('Periodogram using the defaul
t rectangular window for 100 sample and DFT length'); xlabel ('frequency(Hz)');
ylabel ('Power/Frequency(dB)');grid on
eeg_200= eeg1(1:201); %% create the data sample from 0 to 200 sample from column
1.
nfft_200 = length(eeg_200);
[pxx_200,w2] = periodogram(eeg_200);
subplot(3,2,2), plot(w2,10*log10(pxx_200)); title ('Periodogram using the defaul
t rectangular window for 200 sample and DFT length'); xlabel ('frequency(Hz)');
ylabel ('Power/Frequency(dB)');grid on;
eeg_1000= eeg1(1:1001); %% create the data sample from 0 to 1000 sample from col
umn 1.
nfft_1000 = length(eeg_1000);
[pxx_1000,w3] = periodogram(eeg_1000);
subplot(3,2,3), plot(w3,10*log10(pxx_1000)); title ('Periodogram using the defau
lt rectangular window for 1000 sample and DFT length'); xlabel ('frequency(Hz)')
; ylabel ('Power/Frequency(dB)');grid on;
eeg_2000= eeg1(1:2001); %% create the data sample from 0 to 1000 sample from col
umn 1.
nfft_2000 = length(eeg_2000);
[pxx_2000,w4] = periodogram(eeg_2000);
subplot(3,2,4), plot(w4,10*log10(pxx_2000)); title ('Periodogram using the defau
lt rectangular window for 2000 sample and DFT length'); xlabel ('frequency(Hz)')
; ylabel ('Power/Frequency(dB)');grid on;
%% this method is slide the window through the entire data at every 1/2 second,
calculate the frequency, average it.
[p,f] = pwelch(eeg1,hamming(fs),.5*fs, 2*fs,fs); %%
figure; subplot (421), plot (f,10*log10(p),'r'); xlabel('freq (hz)');
ylabel('PSD Amplitude'); title('Power SPectral Density via Welchs method');grid
on;
subplot (422), plot (f,10*log10(p),'g'); xlabel('freq (hz)');ylabel('PSD Amplitu
de'); title('Power SPectral Density via Welchs method zoom in at 40 hz'); xlim([

0,40]);grid on;
%text(0.5,-1/3,'{\itNote the odd symmetry.}')
%%%%%%%
%%% problem 2
%2. Given three signals:
%x1 = cos(2*pi*4*t)
%x2 = cos(2*pi*20*t)
%x3 = cos(2*pi*40*t)
%Generate .3 seconds of each signal. First, combine them into new signals
%x4 = x1 + x2 + x3
x4 is the sum of the first three signals.
%x5 = [x1 x2 x3] where x5 is concatenated from the first 3 vectors
clc;clear all;close all;
t = 0:0.01:1;
x1 = cos(2*pi*4*t); % for x1: frequency is 4hz,
x2 = cos(2*pi*20*t);%x2: frequency = 20Hz,
x3 = cos(2*pi*40*t);% is 40 Hz.
x4 = x1 + x2 + x3;
f1 = 4;
f2 = 20;
f3= 40;
T1 = 1/f1;
T2 = 1/f2;
T3 = 1/f3;
figure;
subplot(2,2,1), plot(t,x1); xlabel('Time (s)'), ylabel('Amplitude'), title('sign
al: x1 = cos(2*pi*4*t) ');
subplot(2,2,2), plot(t,x2); xlabel('Time (s)'), ylabel('Amplitude'), title('sign
al: x2 = cos(2*pi*20*t) ');
subplot(2,2,3), plot(t,x3); xlabel('Time (s)'), ylabel('Amplitude'), title('sign
al: x3 = cos(2*pi*40*t) ');
subplot(2,2,4), plot(t,x4); xlabel('Time (s)'), ylabel('Amplitude'), title('sign
al: x4 = x1 + x2 + x3 ');
% Concatinate the three signals:
x5 = [x1 x2 x3] ;
figure;
plot(x5); xlabel('Time (s)'), ylabel('Amplitude'), title('Concatinate the thr
ee signals: x1, x2, and x3 ');
%What is the Nyquist rate for this signal?
fN1=f1/2;
fN2 = f2/2;
FN3= f3/2; %Fmax
fs = 50; %The Nyquist rate is FN= 2Fmax
%plot the spectrum of each signal. Compare the results.
NFFT_x1 = 2 ^ nextpow2(length(x1)); %% number points. Number of DFT points, spe
cified as a positive integer. For a real-valued input signal, x, the PSD estimat
e, pxx has length (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd.
For a complex-valued input signal,x, the PSD estimate always has length nfft. I
f nfft is specified as empty, the default nfft is used.
Y_x1 = fft(x1, NFFT_x1)/length(x1); %% fft of the EEG signals
f_x1 = (fs/2 * linspace(0,1,NFFT_x1/2+1))'; % Vector containing frequencies in H
z
amp_x1 =( 2 * abs(Y_x1(1: NFFT_x1/2+1))); % Vector containing corresponding ampl
itudes
NFFT_x2 = 2 ^ nextpow2(length(x2)); %% number points. Number of DFT points, spe
cified as a positive integer. For a real-valued input signal, x, the PSD estimat

e, pxx
For a
f nfft
Y_x2 =
f_x2 =
z
amp_x2
itudes

has length (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd.
complex-valued input signal,x, the PSD estimate always has length nfft. I
is specified as empty, the default nfft is used.
fft(x2, NFFT_x1)/length(x2); %% fft of the EEG signals
(fs/2 * linspace(0,1,NFFT_x2/2+1))'; % Vector containing frequencies in H
=( 2 * abs(Y_x2(1: NFFT_x2/2+1))); % Vector containing corresponding ampl

NFFT_x3 = 2 ^ nextpow2(length(x3)); %% number points. Number of DFT points, spe


cified as a positive integer. For a real-valued input signal, x, the PSD estimat
e, pxx has length (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd.
For a complex-valued input signal,x, the PSD estimate always has length nfft. I
f nfft is specified as empty, the default nfft is used.
Y_x3 = fft(x3, NFFT_x3)/length(x3); %% fft of the EEG signals
f_x3 = (fs/2 * linspace(0,1,NFFT_x3/2+1))'; % Vector containing frequencies in H
z
amp_x3 =( 2 * abs(Y_x3(1: NFFT_x3/2+1))); % Vector containing corresponding ampl
itudes
NFFT_x4 = 2 ^ nextpow2(length(x4)); %% number points. Number of DFT points, spe
cified as a positive integer. For a real-valued input signal, x, the PSD estimat
e, pxx has length (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd.
For a complex-valued input signal,x, the PSD estimate always has length nfft. I
f nfft is specified as empty, the default nfft is used.
Y_x4 = fft(x4, NFFT_x4)/length(x4); %% fft of the EEG signals
f_x4 = (fs/2 * linspace(0,1,NFFT_x4/2+1))'; % Vector containing frequencies in H
z
amp_x4 =( 2 * abs(Y_x3(1: NFFT_x4/2+1))); % Vector containing corresponding ampl
itudes
NFFT_x5 = 2 ^ nextpow2(length(x5)); %% number points. Number of DFT points, spe
cified as a positive integer. For a real-valued input signal, x, the PSD estimat
e, pxx has length (nfft/2 + 1) if nfft is even, and (nfft + 1)/2 if nfft is odd.
For a complex-valued input signal,x, the PSD estimate always has length nfft. I
f nfft is specified as empty, the default nfft is used.
Y_x5 = fft(x5, NFFT_x5)/length(x5); %% fft of the EEG signals
f_x5 = (fs/2 * linspace(0,1,NFFT_x5/2+1))'; % Vector containing frequencies in H
z
amp_x5 =( 2 * abs(Y_x5(1: NFFT_x5/2+1))); % Vector containing corresponding ampl
itudes
figure;
subplot(3,2,1), plot (f_x1, amp_x1); title ('plot single-sided amplitude spectru
me of signal x1 = cos(2*pi*4*t)'); xlabel ('frequency (Hz)'); ylabel ('|y(f)|');
grid on;
subplot(3,2,2), plot (f_x2, amp_x2); title ('plot single-sided amplitude spectru
me of signal x2 = cos(2*pi*20*t)'); xlabel ('frequency (Hz)'); ylabel ('|y(f)|')
;grid on;
subplot(3,2,3), plot (f_x3, amp_x3); title ('plot single-sided amplitude spectru
me of signal x3 = cos(2*pi*40*t)'); xlabel ('frequency (Hz)'); ylabel ('|y(f)|')
;grid on;
subplot(2,2,4),plot (f_x4, amp_x4); title ('plot single-sided amplitude spectrum
e of signal x4 = x1+x2+x3 '); xlabel ('frequency (Hz)'); ylabel ('|y(f)|');grid
on;
figure;
subplot (211); plot(x5); xlabel('Time (s)'), ylabel('Amplitude'), title('Concati
nate the three signals: x1, x2, and x3 ');
subplot (212); plot (f_x5, amp_x5); title ('plot single-sided amplitude spectrum
e of concatinate the three signals: x1, x2, and x3 '); xlabel ('frequency (Hz)')

; ylabel ('|y(f)|');grid on;

You might also like