Generalfox.com

Advanced Science Topics and Thought

Generalfox.com

If you haven’t already, be sure to check out my prior pages, where I condition the signals referenced here in MATLAB here. If you are not familiar with DSP, then I offer this reference.

MATLAB is a powerful mathematical analysis tool, and I plan to use it to evaluate and examine recorded EEG signals to determine the impact that cellular and other man-made signals have on the brain. Although this has already been determined through other legit scientific studies recently released (another) I wish to perform my own study as an introductory for me into this science.

The basics of signal analysis

I have started learning about Digital Signal Analysis, and have created a small tutorial that proves my method of extracting the frequencies found within a signal functions as expected. In my example, I will create a 1Hz sinewave with an amplitude of 1, phase of 0 degrees, and based on a 250Hz sampling, and then I will use the FFT function to extract the frequencies found within. Using the MATLAB script below, in a new script and clean workspace, I created a sine wave consisting of a 1Hz and 5Hz signal:

%Wave properties
w1=1;  % Frequency1 (Hz)
A1=2;  % Amplitude1 (dimensionless)
w2=5;  % Frequency2 (Hz)
A2=3;  % Amplitude2 (dimensionless)
% Time properties
Datapoints = 1000;  % Number of recorded data;
Length=10;% Length (seconds);
Step= Length/Datapoints;   % Fraction of seconds
t = (0:Datapoints-1)*Step;  % Time vector
% Sum of a w1-Hz sinusoid and a w2-Hz sinusoid
y = A1*sin(2*pi*w1*t) + A2*sin(2*pi*w2*t);

We will plot a single-sided amplitude spectrum of the generated sine wave:

% Plot single-sided amplitude spectrum
plot(f,2*abs(Y(1:NFFT/2+1)))
axis([0 6 0 6])
title(‘Single-Sided Amplitude Spectrum of y(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(‘Amplitude – |Y(f)|’)

Now we will determine the frequencies that make up the signal using the following code below:

% Fourier Transformation
NFFT = Datapoints;
Y = fft(y,NFFT)/Datapoints;
fs=Datapoints/Length;
f = fs/2*linspace(0,1,NFFT/2+1);
[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.1;
Amplitudes=B(B>=BFloor)
Frequencies=f(IX(1+end-numel(Amplitudes):end))

As can be seen above two results are found: 1Hz with amplitude 2, and 5Hz with amplitude of 3. If noise is a problem, then it can be filtered out by adjusting the BFloor constant to a higher number.

Signal Analysis

I wanted to compare the frequency components between P8 and T8. I loaded back in my workspace, and ran the below code. As can be seen there were some similarities between them.

% Determine the frequencies
T=1/fs;
t = (0:row_count-1)*T;
% Change S and S1 to the signals you wish to compare
S = P8_Filtered;
S1 = T8_Filtered;Y = fft(S);
P2 = abs(Y/row_count);
P1 = P2(1:row_count/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = fs*(0:(row_count/2))/row_count;
plot(f,P1);
hold on
Y = fft(S1);
P4 = abs(Y/row_count);
P3 = P4(1:row_count/2+1);
P3(2:end-1) = 2*P3(2:end-1);
f = fs*(0:(row_count/2))/row_count;
plot(f,P3);

I wanted to see what frequencies can be found within C3. I plotted the result using the code below. As can be seen, there were a lot of them – MATLAB counted 140 of them. Note that adjusting the floor changes the number of signals found.

% Fourier Transformation
NFFT = row_count;
Y = fft(C3_Filtered,NFFT)/row_count;
f = fs/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum
plot(f,2*abs(Y(1:NFFT/2+1)))
title(‘Single-Sided Amplitude Spectrum of y(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(‘Amplitude – |Y(f)|’)[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.5;
Amplitudes=B(B>=BFloor)
Frequencies=f(IX(1+end-numel(Amplitudes):end))

My goal is to work towards gaining an understanding of which frequencies are common to the various areas of the brain and determining their phase (to see if they are synchronized). I decided to compare the signals found during my EEG recording between C3 and C4. The following code will generate two variables, each containing a list of the frequencies found in each of the signals, rounded to one decimal place.

% Fourier Transformation of C3
NFFT = row_count;
Y = fft(C3_Filtered,NFFT)/row_count;
f = fs/2*linspace(0,1,NFFT/2+1);
% Extract the frequencies
[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.5;
Amplitudes_C3=B(B>=BFloor);
Frequencies_C3=f(IX(1+end-numel(Amplitudes_C3):end));
% Fourier Transformation of C4
NFFT = row_count;
Y = fft(C4_Filtered,NFFT)/row_count;
f = fs/2*linspace(0,1,NFFT/2+1);
% Extract the frequencies
[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.5;
Amplitudes_C4=B(B>=BFloor);
Frequencies_C4=f(IX(1+end-numel(Amplitudes_C4):end));
% Build the variables and condition the frequencies
Frequencies_C3_Rounded = round(Frequencies_C3,1);
Frequencies_C4_Rounded = round(Frequencies_C4,1);
Frequencies_C3_Rounded_Sorted = sort(Frequencies_C3_Rounded);
Frequencies_C4_Rounded_Sorted = sort(Frequencies_C4_Rounded);
% Plot the results
plot(Frequencies_C3_Rounded_Sorted)
hold on
plot(Frequencies_C4_Rounded_Sorted)

It is interesting that many frequencies were duplicated. So I expanded the investigation to include all of the unique frequencies found in each of the signals, and decided to sort them so it would be easier to compare them. I wrote a MATLAB script to create the necessary variables – the program was broke into 4 blocks below (for space). I’ll improve the script later.

for x = 1:16
if x == 1
EEG_Signal = C3_Filtered;
elseif x == 2
EEG_Signal = C4_Filtered;
elseif x == 3
EEG_Signal = F3_Filtered;
elseif x == 4
EEG_Signal = F4_Filtered;
elseif x == 5
EEG_Signal = F7_Filtered;
elseif x == 6
EEG_Signal = F8_Filtered;
elseif x == 7
EEG_Signal = Fp1_Filtered;
elseif x == 8
EEG_Signal = Fp2_Filtered;
elseif x == 9
EEG_Signal = O1_Filtered;
elseif x == 10
EEG_Signal = O2_Filtered;
elseif x == 11
EEG_Signal = P3_Filtered;
elseif x == 12
EEG_Signal = P4_Filtered;
elseif x == 13
EEG_Signal = P7_Filtered;
elseif x == 14
EEG_Signal = P8_Filtered;
elseif x == 15
EEG_Signal = T7_Filtered;
elseif x == 16
EEG_Signal = T8_Filtered;
end
NFFT = row_count;
Y = fft(EEG_Signal,NFFT)/row_count;
f = fs/2*linspace(0,1,NFFT/2+1);
[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.5;
amplitude_variable=B(B>=BFloor);
variable=f(IX(1+end-numel(amplitude_variable):end));

if x == 1
C3_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 2
C4_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 3
F3_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 4
F4_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 5
F7_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 6
F8_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 7
Fp1_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 8
Fp2_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 9
O1_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 10
O2_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 11
P3_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 12
P4_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 13
P7_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 14
P8_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 15
T7_Filtered_Frequencies = unique(sort(round(variable,1)));
elseif x == 16
T8_Filtered_Frequencies = unique(sort(round(variable,1)));
end
end
clear x;
clear EEG_Signal;
clear variable;
clear NFFT;
clear Y;
clear f;
clear BFloor;
clear amplitude_variable;
clear B;
clear IX;

This creates variables for each EEG placement that contains each of the unique frequencies that were found in the signal. I scanned through them and found that across them, only a few EEG placements recorded frequencies higher than 31.3 Hz – those were F3, Fp2, O1, P3, P8, T7, and T8, which contained the following frequencies: 37.6, 44.9, 45.4, 70.4, 74.8, 79.4, 113.8 Hz.

I wanted to source these frequencies in the signal and see the their amplitudes – determine where the were localized. In the segment of code above where we create the variables that hold the Filtered_Frequencies, I modified the above code as follows:

    if x == 1
        C3_Filtered_Frequencies = round(variable,1);
        C3_Filtered_Amplitude = amplitude_variable;
    elseif x == 2
        C4_Filtered_Frequencies = round(variable,1);
        C4_Filtered_Amplitude = amplitude_variable;
    elseif x == 3
        F3_Filtered_Frequencies = round(variable,1);
        F3_Filtered_Amplitude = amplitude_variable;
    elseif x == 4
        F4_Filtered_Frequencies = round(variable,1);
        F4_Filtered_Amplitude = amplitude_variable;
    elseif x == 5
        F7_Filtered_Frequencies = round(variable,1);
        F7_Filtered_Amplitude = amplitude_variable;
    elseif x == 6
        F8_Filtered_Frequencies = round(variable,1);
        F8_Filtered_Amplitude = amplitude_variable;
    elseif x == 7
        Fp1_Filtered_Frequencies = round(variable,1);
        Fp1_Filtered_Amplitude = amplitude_variable;
    elseif x == 8
        Fp2_Filtered_Frequencies = round(variable,1);
        Fp2_Filtered_Amplitude = amplitude_variable;
    elseif x == 9
        O1_Filtered_Frequencies = round(variable,1);
        O1_Filtered_Amplitude = amplitude_variable;
    elseif x == 10
        O2_Filtered_Frequencies = round(variable,1);
        O2_Filtered_Amplitude = amplitude_variable;
    elseif x == 11
        P3_Filtered_Frequencies = round(variable,1);
        P3_Filtered_Amplitude = amplitude_variable;
    elseif x == 12
        P4_Filtered_Frequencies = round(variable,1);
        P4_Filtered_Amplitude = amplitude_variable;
    elseif x == 13
        P7_Filtered_Frequencies = round(variable,1);
        P7_Filtered_Amplitude = amplitude_variable;
    elseif x == 14
        P8_Filtered_Frequencies = round(variable,1);
        P8_Filtered_Amplitude = amplitude_variable;
    elseif x == 15
        T7_Filtered_Frequencies = round(variable,1);
        T7_Filtered_Amplitude = amplitude_variable;
    elseif x == 16
        T8_Filtered_Frequencies = round(variable,1);
        T8_Filtered_Amplitude = amplitude_variable;
    end
end

After running the script you’ll find the frequencies found in each of the EEG placements (_Filtered_Frequencies), and their amplitudes (_Filtered_Amplitude).

I wanted to find where these frequencies found inside each of the EEG placements. I ran the code below against each of the EEG placements that had the unique frequencies in them.

% Find the below frequency in the sample
Signal = P8_Filtered_Frequencies;
NumberToFind = 70.4;
% Routine
P8_Matches_70_4 = find(Signal == NumberToFind);
clear Signal;
clear NumberToFind;
I ran the code to the left and adjusted it to create the different P8_Matches_ variables below:

The frequency 70.4 Hz can be found at multiple places in the P8_Matches_70_4 variable. I show the first place (164) below:

A few people have asked me to post my EEG recordings, so I have placed them on GITHUB, here. I will also be moving all of the supporting MATLAB files there as well. Apparently, you are now able to extract silent speech from EEG readings – I wonder if anyone can extract mine?