Examples of the output can be found at the Sound Project Home Page .
% This program loads a data file of time and pressure
% from any device. It then plots the curve, analyzes for
% fundamental frequency and overtones.
clear all
% Load data file
instr = input('Enter filename without .dat and with single quotes ');
load([instr '.dat']);
notes = eval(instr);
time = notes(:,1);
amp = notes(:,2);
q = size(time);
disp ('Position the cursor over a peak and click.');
disp ('Repeat for 3 successive peaks.');
pause
% This keeps the plots manageable. Classroom testing showed that
% 500-600 data points still produced curves which could be viewed.
% This section trims the larger ULI files for viewing.
if q<600
plot(time,amp);
else
plot(time(1:500),amp(1:500));
end
title(instr);
xlabel('Time(s)');
ylabel('Pressure');
% Now select points to calculate frequency
s1=ginput(4);
t1=s1(1,1);
t2=s1(2,1);
t3=s1(3,1);
t4=s1(4,1);
freq(1,1)=1/(t2-t1);
freq(2,1)=1/(t3-t2);
freq(3,1)=1/(t4-t3);
avgfreq=mean(freq);
fprintf('Fundamental frequency = %4.2f \n',avgfreq);
pause
% Now perform fast fourier transform
disp('Now we perform Fourier transform of the data');
n = size(time);
% This section of code allows for the selection of the best power of
% 2 for the FFT calculation. Unfortunately it takes the CBL-82 system to
% 64 data points - which produces poorer graphs than the original program
npower = fix (log2(n));
m = pow2(npower);
pause
Y=fft(amp,m);
Pyy=real(Y .* conj(Y) /m(1));
% The 0 point is not plotted, since it's amplitude may overwhelm other
% data. So the f and Pyy functions are plotted from the second points on.
f=4000*(1:(m(1)/2 -1))/m(1);
figure
plot(f,Pyy(2:m(1)/2));
title(['Fast Fourier transform of ', instr]);
pause
% The user chooses frequencies from the FFT
x = input('How many frequencies to choose? ');
s2 = ginput(x);
t=0:max(time)/100:max(time);
color = 'mcyrgbmcyrgb';
figure
hold
for i = 1:x
y(i,:)= s2(i,2) * cos(2 * pi * s2(i,1) * t);
plot(t,y(i,:),color(i));
pause
end
ytot=sum(y);
plot(t,ytot,'w');
pause
hold off
% The program plots some graphs for comparison
subplot(211),plot(t,ytot);
title('Reconstructed wave');
if q<600
subplot(212),plot(time,amp);
else
subplot(212),plot(time(1:500),amp(1:500));
end
title('Original wave');
subplot(111);
s3(1,:)=reshape(s2(:,1),1,x);
s3(2,:)=reshape(s2(:,2),1,x);
disp('Frequencies Amplitudes');
fprintf(' %4.1f %2.4f\n',s3);
pause
figure
if q<600
subplot(211),plot(time,amp);
else
subplot(211),plot(time(1:500),amp(1:500));
end
title('Original wave');
subplot(212), plot(f,Pyy(2:m/2));
title('Frequency Spectrum');
subplot(111);
% This program loads a data file of time and pressure
% from CBL -microphone. It then plots the curve, analyzes for
% fundamental frequncy and overtones.
clear all
% Load data file
instr = input('Enter filename without .dat and with single quotes ');
load([instr '.dat']);
notes = eval(instr);
time = notes(:,1);
amp = notes(:,2);
disp ('Position the cursor over a peak and click.');
disp ('Repeat for 3 successive peaks.');
pause
plot(time,amp);
title(instr);
xlabel('Time(s)');
ylabel('Pressure');
% Now select points to calculate frequency
s1=ginput(4);
t1=s1(1,1);
t2=s1(2,1);
t3=s1(3,1);
t4=s1(4,1);
freq(1,1)=1/(t2-t1);
freq(2,1)=1/(t3-t2);
freq(3,1)=1/(t4-t3);
avgfreq=mean(freq);
fprintf('Fundamental frequency = %4.2f \n',avgfreq);
pause
figure
% Now perform fast fourier transform
disp('Now we perform Fourier transform of the data');
pause
Y=fft(amp,128);
Pyy=real(Y .* conj(Y) /128);
f=4000*(0:63)/128;
plot(f,Pyy(1:64));
title(['Fast Fourier transform of ', instr]);
pause
%y=[];
x = input('How many frequencies to choose?');
s2 = ginput(x);
t=0:0.00025:0.025;
color = 'mcyrgbmcyrgb';
figure
hold
for i = 1:x
y(i,:)= s2(i,2) * cos(2 * pi * s2(i,1) * t);
plot(t,y(i,:),color(i));
pause
end
ytot=sum(y);
plot(t,ytot,'w');
pause
hold off
subplot(211),plot(t,ytot);
title('Reconstructed wave');
subplot(212), plot(time, amp);
title('Original wave');
subplot(111);
s3(1,:)=reshape(s2(:,1),1,x);
s3(2,:)=reshape(s2(:,2),1,x);
disp('Frequencies Amplitudes');
fprintf(' %4.1f %2.3f\n',s3);