1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- % cbphase.m
- % David Rowe Aug 2012
- % Used to experiment with critical band phase perception and smoothing
- function cbphase
- Wo = 100.0*pi/4000;
- L = floor(pi/Wo);
- A = zeros(1,L);
- phi = zeros(1,L);
- % three harmonics in this band
- b = 4; a = b-1; c = b+1;
- % set up phases and mags for 2nd order system (see phasesecord.m)
-
- wres = b*Wo;
- phi(a) = 3*pi/4 + wres;
- phi(b) = pi/2 + wres;
- phi(c) = pi/4 + wres;
- A(a) = 0.707;
- A(b) = 1;
- A(c) = 0.707;
- % add linear component
- phi(1) = pi;
- phi(2:L) = phi(2:L) + (2:L)*phi(1);
- phi = phi - 2*pi*(floor(phi/(2*pi)) + 0.5);
- N = 16000;
- Nplot = 250;
- s = zeros(1,N);
- for m=a:c
- s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi(m));
- s = s + s_m;
- endfor
- figure(2);
- clf;
- subplot(211)
- plot((1:L)*Wo*4000/pi, A,'+');
- subplot(212)
- plot((1:L)*Wo*4000/pi, phi,'+');
- %v = A(a)*exp(j*phi(a)) + A(b)*exp(j*phi(b)) + A(c)*exp(j*phi(c));
- %compass(v,"r")
- %hold off;
-
- % est phi1
- diff = phi(b) - phi(a)
- sumi = sin(diff);
- sumr = cos(diff);
- diff = phi(c) - phi(b)
- sumi += sin(diff);
- sumr += cos(diff);
- phi1_ = atan2(sumi, sumr)
- s_v = cos(Wo*(0:(N-1)) + phi1_);
- figure(1);
- clf;
- subplot(211)
- plot(s(1:Nplot));
- hold on;
- plot(s_v(1:Nplot),"r");
- hold off;
- % build (hopefully) perceptually similar phase
- phi_(a) = a*phi1_;
- phi_(b) = b*phi1_;
- phi_(c) = c*phi1_;
- s_ = zeros(1,N);
- for m=a:c
- s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi_(m));
- s_ = s_ + s_m;
- endfor
-
- subplot(212)
- plot(s_(1:Nplot));
-
- gain = 8000;
- fs=fopen("orig_ph.raw","wb");
- fwrite(fs,gain*s,"short");
- fclose(fs);
- fs=fopen("mod_ph.raw","wb");
- fwrite(fs,gain*s_,"short");
- fclose(fs);
- endfunction
|