Running a function multiple times and recording outputs for each of the runs in one table.
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have a set of data (125,000 rows, 38 columns) and I want to run this code for each column in a matrix starting from column 2. Then, create 2 tables from the outputs. Colum ONE is the time ( a common column) that is used in the calculations.
Here are the codes:
%import xlsx data
dat=importdata('DataBook.xlsx');
t=dat.data(:,1); %time
so=dat.data(:,2); %original signal( this is only for one column, I need the same code to repeat itself for the remaining columns (from 2 to 38)
%frequency space
kHz=1e3;
f_us=27.441*kHz;
T_us=1/f_us;
dt=t(2)-t(1);
Fs=1/dt; %sampling frequency
f=linspace(1,Fs,length(t));
%Fourier Transform
SO=fft(so);
figure(1); plot(f,abs(SO)); xlim([0 Fs/2]); xlabel('Frequency [Hz]');
%theoretical undersampling frequency
ncycle=ceil(dt/T_us); %=9
tau=T_us*ncycle-dt;
T_fake_theory=(T_us/tau)*dt;
F_fake_theory=1/T_fake_theory; %684 Hz
%practical undersampling frequency due to stage move
SOa=abs(SO);
F_fake=f(find(SOa(1:round(length(SOa)/2))==max(SOa))); %663.9 Hz
T_fake=1/F_fake;
%IQ-signal
s_cos=so.*cos(2*pi*F_fake*t);
s_sin=so.*sin(2*pi*F_fake*t);
%move-mean
N_mean_cycle=100;
mean_point=round((N_mean_cycle*T_fake)/dt);
mean_cos = 2*movmean(s_cos,[mean_point mean_point]);
mean_sin = 2*movmean(s_sin,[mean_point mean_point]);
mean_abs=sqrt(mean_cos.^2+mean_sin.^2); %result of A(t) (I need these values in a table for all columns; a matrix of 125000 rows and 37 columns)
mean_phase=atan2(mean_sin,mean_cos); %result of theta(t) (I need these values in a table for all columns; a matrix of 125000 rows and 37 columns)
0 commentaires
Réponse acceptée
VBBV
le 14 Mai 2023
Assuming some random data, the output data can be fit into a table as shown below
% some random data
data= randi([2 200],125000,38); %importdata('DataBook.xlsx');
t=data(:,1); %time
so=data(:,2:38);
%original signal( this is only for one column,
% I need the same code to repeat itself for the remaining columns (from 2 to 38)
%frequency space
kHz=1e3;
f_us=27.441*kHz;
T_us=1/f_us;
dt=t(2)-t(1);
Fs=1/dt; %sampling frequency
f=linspace(1,Fs,length(t));
%Fourier Transform
SO=fft(so);
% figure(1); plot(f,abs(SO)); xlabel('Frequency [Hz]');
%theoretical undersampling frequency
ncycle=ceil(dt/T_us); %=9
tau=T_us*ncycle-dt;
T_fake_theory=(T_us/tau)*dt;
F_fake_theory=1/T_fake_theory; %684 Hz
%practical undersampling frequency due to stage move
SOa=abs(SO);
for k = 1:size(SOa,2)
F_fake(:,k)=f(find(SOa(1:round(length(SOa)/2),k)==max((SOa(:,k)))));
end %663.9 Hz
T_fake=1./F_fake;
%IQ-signal
s_cos=so.*cos(2*pi*F_fake.*t);
s_sin=so.*sin(2*pi*F_fake.*t);
%move-mean
N_mean_cycle=100;
% mean_point=round((N_mean_cycle*T_fake)./dt)
% mean_cos = 2*movmean(s_cos,[mean_point mean_point+5]);
% mean_sin = 2*movmean(s_sin,[mean_point mean_point+5]);
% mean_abs=sqrt(mean_cos.^2+mean_sin.^2)
%result of A(t) (I need these values in a table for all columns; a matrix of 125000 rows and 37 columns)
% mean_phase=atan2(mean_sin,mean_cos)
TT = table(s_cos,s_sin,'VariableNames',{'s_cos','s_sin'})
5 commentaires
VBBV
le 15 Mai 2023
Modifié(e) : VBBV
le 15 Mai 2023
the mean_point must be a positive scalar value if you want to use movmean function, The old syntax for movmean that was used in your code needs to be used ONLY for a vector NOT for a matrix.
% some random data
data= randi([2 200],125000,38); %importdata('DataBook.xlsx');
t=data(:,1); %time
so=data(:,2:38);
%original signal( this is only for one column,
% I need the same code to repeat itself for the remaining columns (from 2 to 38)
%frequency space
kHz=1e3;
f_us=27.441*kHz;
T_us=1/f_us;
dt=t(2)-t(1);
Fs=1/dt; %sampling frequency
f=linspace(1,Fs,length(t));
%Fourier Transform
SO=fft(so);
% figure(1); plot(f,abs(SO)); xlabel('Frequency [Hz]');
%theoretical undersampling frequency
ncycle=ceil(dt/T_us); %=9
tau=T_us*ncycle-dt;
T_fake_theory=(T_us/tau)*dt;
F_fake_theory=1/T_fake_theory; %684 Hz
%practical undersampling frequency due to stage move
SOa=abs(SO);
for k = 1:size(SOa,2)
F_fake(:,k)=f(find(SOa(1:round(length(SOa)/2),k)==max((SOa(:,k)))));
end %663.9 Hz
T_fake=1./F_fake;
%IQ-signal
s_cos=so.*cos(2*pi*F_fake.*t)
s_sin=so.*sin(2*pi*F_fake.*t)
% simple mean
mean_abs=sqrt(mean(s_cos.^2)+mean(s_sin.^2))
%result of A(t) (I need these values in a table for all columns; a matrix of 125000 rows and 37 columns)
mean_phase=atan2(mean(s_sin),mean(s_cos))
N_mean_cycle=100;
% the mean point must be a positive value if you want to use movmean
mean_point=round((N_mean_cycle*T_fake)./dt)
% this syntax needs to be used ONLY for a vector NOT for matrix
% mean_cos = 2*movmean(s_cos,[mean_point mean_point+5]);
% mean_sin = 2*movmean(s_sin,[mean_point mean_point+5]);
% this syntax is used for matrix
mean_cos = 2*movmean(s_cos,max(mean_point), 2);
mean_sin = 2*movmean(s_sin,max(mean_point), 2);
mean_abs=sqrt((mean_cos.^2)+(mean_sin.^2))
%result of A(t) (I need these values in a table for all columns; a matrix of 125000 rows and 37 columns)
mean_phase=atan2(mean_sin,mean_cos)
T1 = table(t,'VariableNames',{'time'}) % time
T2 = table(mean_cos,mean_sin,'VariableNames',{'mean_cos','mean_sin'}) % outputs
T_table = cat(2,T1,T2)
Plus de réponses (0)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!