FFT using CSV data file
Show older comments
Hi guys, ive been struggling with a task. I have to import the data from .csv file and then do the fft from the data imported, im using code like this:
filename = 'pomiary1.csv';
X = csvread(filename);
Fs = 2.5;
T = 1/Fs;
L = 100000;
t = (0:L-1)*T;
Fn = Fs/2;
FX = fft(X)/L;
Fv = linspace(0, 1, fix(L/2)+1)*Fn;
Iv = 1:length(Fv);
figure(1);
plot(Fv, abs(FX(Iv))*2)
grid
title('Fourier Transform Of Original Signal ‘X’')
xlabel('Frequency (Hz)')
ylabel('Amplitude')
Code seems to be fine but the fft it gives is a straight line on 0 level (x axis) and i dont know why
I attached the data file first column is time second is the current
Answers (1)
Star Strider
on 4 Jul 2017
I could not get csvread to read the file correctly, because each number in the second column has ‘;;;;’ following it in the file you attached.
This works:
[t,S] = xlsread(filename);
X = cellfun(@(c) sscanf(c,'%f;;;;'), S);
Ts = mean(diff(t));
Fs = 1/Ts;
L = length(t);
Fn = Fs/2;
FX = fft(X)/L;
Fv = linspace(0, 1, fix(L/2)+1)*Fn;
Iv = 1:length(Fv);
figure(1);
semilogy(Fv, abs(FX(Iv))*2)
grid
title('Fourier Transform Of Original Signal ‘X’')
xlabel('Frequency (Hz)')
ylabel('Amplitude')
I changed your code slightly to correct for the sampling time interval and to define a few other variables from the data.
6 Comments
Mateusz Bess
on 4 Jul 2017
Edited: Mateusz Bess
on 4 Jul 2017
Star Strider
on 4 Jul 2017
My pleasure!
You could make a function file from it. See the documentation on Function Basics (link) for details.
Just passing the name of the file to the function might not be enough, however. The problem I had with your file were the ‘;;;;’ after the numbers in the ‘S’ cell array. You would actually have to look at the file to determine whether something like that exists, or the funciton would throw an error and exit. I would read the data outside the function, then pass the time vector and signal vector (or matrix) to the function instead.
When in doubt, plot your data. Adding this:
figure(2)
plot(t, X)
grid
reveals that your data are a noisy sine with a period of about 0.02 (seconds?), or a frequency of 50 (Hz?).
Changing figure(1) to:
figure(1);
plot(Fv, abs(FX(Iv))*2)
grid
title('Fourier Transform Of Original Signal ‘X’')
xlabel('Frequency (Hz)')
ylabel('Amplitude')
axis([0 500 ylim])
shows the 50 Hz peak, and that the rest of your signal is essentially noise.
Mateusz Bess
on 4 Jul 2017
Star Strider
on 4 Jul 2017
My code works or I would not have posted it.
Your calculation for sampling frequency ‘Fs’ is incorrect. The sampling frequency is the inverse of the sampling interval, ‘Ts’ in my code. The sampling interval is 4E-7, and the sampling frequency is then 2.5E+6.
Try this new version of figure(3):
figure(3)
subplot(3,1,1)
plot(Fv, abs(FX(Iv))*2, 'LineWidth',1.5)
title('Fourier Transform Of Original Signal ‘X’')
xlabel('Frequency (Hz)')
ylabel('Amplitude')
grid
subplot(3,1,2)
plot(Fv, abs(FX(Iv))*2)
title('Fourier Transform Of Original Signal ‘X’')
xlabel('Frequency (Hz) [Zoomed]')
ylabel('Amplitude')
axis([0 500 ylim])
grid
subplot(3,1,3)
plot(t, X)
grid
title('Time Domain Plot Of Original Signal ‘X’')
xlabel('Time (s)')
ylabel('Amplitude')
It should explain everything.
Mateusz Bess
on 4 Jul 2017
Star Strider
on 4 Jul 2017
Here you go ...

Categories
Find more on Measurements and Feature Extraction in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!