%{ Matt Montag University of Miami EEN502 Project 1 Experimenting with Doppler Sound Effects %} pause off; clear all; clc; c = 345; % speed of sound - m/s fs = 8000; % sample rate - 1/s %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PART 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f0 = 440; % source frequency - hz A = 1; % source amplitude W = 2*pi*f0; % omega - rad/s T = 6; % total time - seconds l = 100; % length of path - meters Vs = l/T; % speed of source - m/s y = 0; % distance from observer to sound path - m t = -T/2:1/fs:T/2; % array of time x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wav = env.*cos(Wa.* t); % array of waveform samples wav = .95 * wav ./ max(abs(wav)); soundsc(wav, fs); wavwrite(wav,fs,16,'prob1.wav'); subplot(3,1,1); plot(t, Va); title('Apparent Velocity of Source'); xlabel('time (s)'); ylabel('velocity (m/s)'); subplot(3,1,2); plot(t, env); title('Apparent Amplitude of Source'); xlabel('time (s)'); ylabel('amplitude'); subplot(3,1,3); plot(t, Fa); title('Apparent Frequency of Source'); xlabel('time (s)'); ylabel('frequency (hz)'); saveas(gcf,'prob1.png'); disp('Part 1 complete. Press a key...'); pause; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PART 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% y = 10; % distance from observer to sound path - m x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wav = env.*cos(Wa.* t); % array of waveform samples soundsc(wav, fs); wavwrite(wav,fs,16,'prob2.wav'); wav = .95 * wav ./ max(abs(wav)); subplot(3,1,1); plot(t, Va); title('Apparent Velocity of Source'); xlabel('time (s)'); ylabel('velocity (m/s)'); subplot(3,1,2); plot(t, env); title('Apparent Amplitude of Source'); xlabel('time (s)'); ylabel('amplitude'); subplot(3,1,3); plot(t, Fa); title('Apparent Frequency of Source'); xlabel('time (s)'); ylabel('frequency (hz)'); saveas(gcf,'prob2.png'); disp('Part 2 complete. Press a key...'); pause; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PART 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % using FM equation: % en.wikipedia.org/wiki/Frequency_modulation#Sinusoidal_baseband_signal % y(t) = cos(w*t + fd*cos(wm*t)/fm) Fd = 100; % modulation depth - hz Fm = 2; % modulation rate - hz Wm = 2*pi*Fm; % modulation rate - rad/s Fa = Fa + (Fd./Fm)*cos(Wm .* t); % Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz % Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wav = env.*cos(Wa .* t + (Fd./Fm).*cos(Wm .* t)); % array of waveform samples wav = .95 * wav ./ max(abs(wav)); soundsc(wav, fs); wavwrite(wav,fs,16,'prob3.wav'); figure(); subplot(3,1,1); plot(t, Va); title('Apparent Velocity of Source'); xlabel('time (s)'); ylabel('velocity (m/s)'); subplot(3,1,2); plot(t, env); title('Apparent Amplitude of Source'); xlabel('time (s)'); ylabel('amplitude'); subplot(3,1,3); plot(t, Fa); title('Apparent Frequency of Source'); xlabel('time (s)'); ylabel('frequency (hz)'); saveas(gcf,'prob3.png'); disp('Part 3 complete. Press a key...'); pause; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PART 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SPECIAL NOTE: here we simulate the difference in observer position with % a time shift because there is a sign change problem when x=0 does not % lie in the middle of the source position array. % % SPECIAL NOTE: the interaural distance of 17 cm is exaggerated by 4x in % order to make the stereo effect audible. % head = .34; % interaural radius - m y = 0; % distance from observer to sound path - m t = -T/2+head/Vs:1/fs:T/2+head/Vs; % shifted array of time x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wavL = env.*cos(Wa.* t); % array of waveform samples t = -T/2-head/Vs:1/fs:T/2-head/Vs; % shifted array of time x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wavR = env.*cos(Wa.* t); % array of waveform samples wavL = .95 * wavL ./ max(abs(wavL)); wavR = .95 * wavR ./ max(abs(wavR)); wav = [ wavL; wavR ]'; soundsc(wav, fs); wavwrite(wav,fs,16,'prob4a.wav'); disp('Part 4a complete. Press a key...'); pause; y = 10; t = -T/2+head/Vs:1/fs:T/2+head/Vs; % shifted array of time x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wavL = env.*cos(Wa.* t); % array of waveform samples t = -T/2-head/Vs:1/fs:T/2-head/Vs; % shifted array of time x = t .* Vs; % array of source position d = sqrt(x.^2 + y.^2); % array of source distance - m Va = Vs .* cos((atan2(y,x))); % array of apparent velocity d(d<1) = 1; % prevent divide by zero env = 1./d; % array of amplitude envelope Fa = f0.*(c./(c+Va)); % array of apparent frequency - hz Wa = 2*pi*Fa; % array of apparent frequncy - rad/s wavR = env.*cos(Wa.* t); % array of waveform samples wavL = .95 * wavL ./ max(abs(wavL)); wavR = .95 * wavR ./ max(abs(wavR)); wav = [ wavL; wavR ]'; soundsc(wav, fs); wavwrite(wav,fs,16,'prob4b.wav'); disp('Part 4b complete.');