pkg load signal
clear all;
N=20;
fs=44100;
f=1000;
w=2*pi*f;
t=0:1/fs:1 % 1 second
% RAW square wave
w_sqr = square(w*t); % RAW Square wave
figure;
plot(t,w_sqr);
axis([0 1 -1.2 1.2]);
grid on;
hold on;
audiowrite('test_square_wave_RAW.wav',w_sqr,fs);
% approximation
for t=0:1/fs:1
for n=1:N
%Fourier-Fejér taper
sum = sum + ((n-2*N-2)*(cos(pi*n)-1)*sin(n*w*t))/(2*pi*n*(N + 1));
end
Ffej(i)=2*sum;
i=i+1;
sum=0;
end;
Ffej = Ffej';
plot(t,Ffej);
axis([0 1 -1.2 1.2]);
audiowrite('test_square_wave_Ffej.wav',Ffej,fs);
figure;
NFFT = 4096;
L=length(w_saw);
X = fft(w_saw,NFFT);
X = X(1:NFFT/2+1);
Px1 = X.*conj(X)/(NFFT*L);
f = fs*(0:NFFT/2)/NFFT;
plot(f,10*log10(Px1),'g', 'linewidth', 3);
hold on;
L=length(Ffej);
X = fft(Ffej,NFFT);
X = X(1:NFFT/2+1);
Px2 = X.*conj(X)/(NFFT*L);
f = fs*(0:NFFT/2)/NFFT;
plot(f,10*log10(Px2),'k','linestyle','--', 'linewidth', 2);
title('Single Sided Power Spectral Density');
xlabel('Frequency (Hz)')
ylabel('Power Spectral Density- P_{xx} dB/Hz');
legend('w_sqr', 'Ffej');
ylim([-60 0]);
grid on;to approximate square wave is really sloooow... . I've tried to vectorize code but, (as being a old-school-programmer) can't figure out the vectorization logic ... just get errors. Is the sum calculation vectorizable and how to do it correctly?
N=20; fs=44100; f=1000; w=2*pi*f; t=0:1/fs:1 % approximation %Fourier-Fejér taper sum_ = sum((((1:N)-2*N-2).*(cos(pi*(1:N))-1).*sin((1:N).*w.*(0:1/fs:1)'))./(2*pi*(1:N)*(N + 1)), 2); Ffej = 2*sum_; Ffej = Ffej';
Thank you very much!
My for-loop code took over one hour to get result (also seemed to use one core only) ... your code gave result immediately.
You could probably simplify/speedup the line by doing proper matrix algebra instead of just dot-products and sums, but that would require spending 5 minutes to actually understand what the code does. I'd rather not :-)

Just curious why Octave or Matlab tool makers can't automate that job and convert user slow loops to vectors. I have seen some field matlab designs full of slow loops that took hours to finish if it didn't break down.

@kaz I assume it's because Matlab is an interpreted language, so there isn't a compiler doing that kind of optimization.

Well I mean just a utility to convert loops to arrays. Surely they can do that just like they have done so many utilities with sub-licences and get more money as well...






