335 views (last 30 days)

Show older comments

after the fft of the input signal,how to get the frequencies?

irem asci
on 6 Apr 2020

I have 10 seconds of EEG recording that I have used fft on. How can I obtain the frequencies?

numberOfSamples = 20000

samplingRate = 2000

eegFile = readtable('Hit_0_EEG1.txt');

electrodeTimeSeries = eegFile.EEG1;

timeSeries = electrodeTimeSeries(1:numberOfSamples);

y = fft(timeSeries);

posFreq = y(1:(numberOfSamples/2));%

spec = abs(posFreq);

dpb
on 30 Sep 2013

Frequency is totally dependent upon the sample rate of the time signal and duration.

Sampling relationships --

Fmax=1/2dt; T=Ndt; df=Fmax/(N/2); T=1/df

Wayne King
on 30 Sep 2013

Edited: Wayne King
on 7 Nov 2013

dpb is correct, you can use that to create a meaningful frequency vector

For an even length signal, the most common interval is (-Fs/2, Fs/2]

Fs = 1000;

t = 0:1/Fs:1-0.001;

x = cos(2*pi*100*t)+randn(size(t));

xdft = fftshift(fft(x));

df = Fs/length(x);

freq = -Fs/2:df:Fs/2-df;

plot(freq,abs(xdft))

For an odd-length signal, it's common to have an open interval (-Fs/2,Fs/2) where the starting point is -Fs/2+ df/2 and the ending point is Fs/2-df/2

Fs = 1000;

t = 0:1/Fs:1;

x = cos(2*pi*100*t)+randn(size(t));

xdft = fftshift(fft(x));

df = Fs/length(x);

half_res = df/2;

freq = -Fs/2+half_res:df:Fs/2-half_res;

plot(freq,abs(xdft))

Of course for a real-valued signal, if you are only interested in magnitude, you only need 1/2 the frequency axis and magnitudes.

If you have the Signal Processing Toolbox, you can use periodogram to get a power spectrum or power spectral density estimate that will output a frequency vector for you.

Daniel Frisch
on 12 Nov 2020

easyFFT is not part of Matlab itself, but you have to download it and put the path where it is located to Matlab's path, for example using the addpath() function.

I also helped you with PCA. You have to differentiate between the PCA vector (coeff) in the 3D multivariate space, and the time signals in x,y,z data(:,2:4) or the time signals in the PCA base system, score.

addpath('path/to/folder/of/easyFFT.m')

% Generate random data

L = 1000;

Fs = 5000;

t = (1:L)'/Fs;

f = 200;

data = [ t, sin(2*pi*f*t), cos(2*pi*f*t), t*0];

data(:,2:4) = data(:,2:4) + randn(size(data(:,2:4)))*.1; % add some noise

% Extract data

t = data(:,1);

L = size(data,1);

Accel = data(:,2:4);

% Perform PCA

[coeff,score,latent] = pca(Accel); % need to identify the dominant tremor axis of the 3D accelerometer

% Plot multivariate data in 3D

figure()

plot3([zeros(1,3);(coeff(:,1).*sqrt(latent))'], [zeros(1,3);(coeff(:,2).*sqrt(latent))'], [zeros(1,3);(coeff(:,3).*sqrt(latent))'], 'DisplayName','PCA Base')

hold on

scatter3(data(:,2), data(:,3), data(:,4), 'DisplayName','Data')

axis equal

xlabel('x'), ylabel('y'), zlabel('z')

legend;

% Plot time data, separate for each PCA axes

figure();

plot(t,score, 'DisplayName','Accel along PCA axes');

% 1D Time signal along most dominant tremor axis

score1 = score(:,1); % extract signal projected on most dominant tremor axis coef(:,1)

[Y,f] = easyFFT( score1, length(score1), 1, Fs );

figure();

plot(f, abs(Y), 'DisplayName','Dominant Tremor FFT');

KR
on 15 Nov 2020

Thanks, Daniel. Re-downloading easyFFT resolved the issue. Thanks again for all of your help!

Daniel Frisch
on 31 Aug 2020

KR
on 12 Nov 2020

Hi Daniel,

Do you mind identifying my error in using your easyFFT function? Please note that I need to perform the easyFFT on the first component derived from pca (which I haven't been able to work yet).

data = table2array(acceler);

t = data(:,1);

L = size(data,1);

Accel = data(:,2);

Fs = 5000;

Fn = Fs/2;

coeff = pca(Accel); %need to identify the dominant tremor axis of the 3D accelerometer

figure()

plot(pca(Accel))

legend({'X';'Y';'Z'})

[Y,f] = easyFFT(Accel); %error states 'undefined function or variable 'easyFFT'

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

Start Hunting!