Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/WhiteVowel.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/WhiteVowel.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,80 @@ +function [output,aCoeff] = WhiteVowel(data,sr,L,pos) +% function [output,aCoeff] = WhiteVowel(data,sr,L,pos) +% +% Speech is often described as having spectral peaks or formants which +% identify the phonetic signal. An interesting experiment, first proposed by +% XXX, filters a speech signal to remove all the formant information at one +% time during the speech. If there are no formant peaks, how can the speech +% be understood? It turns out that processing, much like RASTA, means that +% relative changes in spectrum are the most important, thus the speech signal +% is understood because the formant transitions carry the information. This +% gives speech an important transparency due +% +% This function takes a speech signal (data) with a given sampling rate (sr). +% It then finds the L-order LPC filter that describes the speech at the given +% position (pos ms). The entire speech signal is then filtered with the +% inverse of the LPC filter, effectively turning the speech spectrum at the +% given time white (flat). + +% Chris Pal, Interval, May 1997 +% (c) 1998 Interval Research Corporation + +fr = 20; fs = 30; preemp = .9378; % LPC defaults + +[row col] = size(data); +if col==1 data=data'; end + +nframe = 0; +msfr = round(sr/1000*fr); +msfs = round(sr/1000*fs); +duration = length(data); +msoverlap = msfs - msfr; +frameNumber = floor(pos/1000*sr/msfr); + +frameStart = round(pos/1000*sr - msfs/2); +frameData = data(frameStart:(frameStart+msfs-1)); +aCoeff = proclpc(frameData, sr, L, fr, fs, preemp); + % Calculate the filter response + % by evaluating the z-transform +spec=lpc_spec(aCoeff); +subplot(2,3,1); +plot(spec); +title('LPC Spectral Slice'); +ylabel('Original') + + % Now do the actual whitening filter +output = filter(aCoeff,1,data)'; + +frameData = output(frameStart:(frameStart+msfs-1)); +bCoeff = proclpc(frameData, sr, L, fr, fs, preemp); +spec=lpc_spec(bCoeff); +subplot(2,3,4); +plot(spec); +ylabel('Whitened'); xlabel('FFT Bin'); + +% 256-DFT +origSpec = 20*log10(abs(specgram(data,512,sr,msfs,msoverlap))); +subplot(2,3,2),imagesc(origSpec); axis xy; colormap(1-gray); +title('Spectrogram'); + +synSpec = 20*log10(abs(specgram(output,512,sr,msfs,msoverlap))); +subplot(2,3,5),imagesc(synSpec); axis xy; colormap(1-gray); +xlabel('Frame #'); + +origloc = origSpec(:,frameNumber); origloc=origloc-max(origloc);origmin=min(origloc); +subplot(2,3,3),plot(origloc),title('Spectrogram'), +axis([1 length(origloc) origmin 0]); + +filloc = synSpec(:,frameNumber); filloc=filloc-max(filloc); +subplot(2,3,6),plot(filloc);ylabel('db'); +axis([1 length(origloc) origmin 0]); +xlabel('FFT Bin'); + +function spec=lpc_spec(aCoeff) +gain=0; +cft=0:(1/255):1; +for index=1:size(aCoeff,1) + gain = gain + aCoeff(index)*exp(-i*2*pi*cft).^index; +end +gain = abs(1./gain); +spec = 20*log10(gain(1:128))';