Sie sind auf Seite 1von 7

SOURCECODE:

Module:ctrl.sci
function[output]=ctrl(song1,bandlimits,maxfreq)
output=[]
[%nargout,%nargin]=argn(0)
mode(0)
ieee(1)
if%nargin<3thenbandlimits=[0,200,400,800,1600,3200,6400]end
if%nargin<4thenmaxfreq=8192end
sample_size=floor((2.2*2)*maxfreq)
pverret/elec301/",song1,".wav"))
x1=wavread(song1)
short_length=max(size(x1))
start=floor((short_length/2)(sample_size/2))
stop=floor((short_length/2)+(sample_size/2))*2
short_sample=x1(start:stop)
status="filteringfirstsong..."
a=filterbank(short_sample,bandlimits,maxfreq)
status="windowingfirstsong..."
b=hwindow(a,0.2,bandlimits,maxfreq)
status="differentiatingfirstsong..."
c=diffrect(b,max(size(bandlimits)))
status="combfilteringfirstsong..."
d=timecomb(c,2,60,240,bandlimits,maxfreq)
e=timecomb(c,0.5,d2,d+2,bandlimits,maxfreq)
f=timecomb(c,0.1,e0.5,e+0.5,bandlimits,maxfreq)
g=timecomb(c,0.01,f0.1,f+0.1,bandlimits,maxfreq)
output=c
h=max(output)
l=min(output)
scale=max(h,l)
output=output/scale
endfunction

Module:filterbank.sci
function[output]=filterbank(sig,bandlimits,maxfreq)
output=[]
[%nargout,%nargin]=argn(0)
mode(0)
ieee(1)
if%nargin<2thenbandlimits=[0,200,400,800,1600,3200]end
if%nargin<3thenmaxfreq=4096end

dft=fft(sig)
n=max(size(dft))
nbands=max(size(bandlimits))
fori=1:nbands1
x=bandlimits(i)/maxfreq
x=x*n
bl(i)=floor(x/2)+1
y=bandlimits(i+1)/maxfreq
y=y*n
br(i)=floor(y/2)
end
temp=bandlimits(nbands)/maxfreq
temp=temp*n
bl(nbands)=floor(temp/2)+1
br(nbands)=floor(n/2)
output=zeros(n,nbands)
fori=1:nbands
output(bl(i):br(i),i)=dft(bl(i):br(i))
output(n+1br(i):n+1bl(i),i)=dft(n+1br(i):n+1bl(i))
end
output(1,1)=0
endfunction

Module:diffrect.sci
function[output]=diffrect(sig,nbands)
output=[]
[%nargout,%nargin]=argn(0)
mode(0)
ieee(1)
if%nargin<2thennbands=6end
n=max(size(sig))
output=zeros(n,nbands)
fori=1:nbands
forj=5:n
//Findthedifferencefromonesmapletothenext
d=sig(j,i)sig(j1,i)
ifd>0then
//Retainonlyifdifferenceispositive(HalfWaverectify)
output(j,i)=d
end
end
end
endfunction

Module:hwindow.sci
function[output]=hwindow(sig,winlength,bandlimits,maxfreq)
output=[]
[%nargout,%nargin]=argn(0)
mode(0)
ieee(1)
//Itisthesecondstepofthebeatdetectionsequence.
if%nargin<2thenwinlength=0.4end
if%nargin<3thenbandlimits=[0,200,400,800,1600,3200]end
if%nargin<4thenmaxfreq=4096end
n=max(size(sig))
nbands=max(size(bandlimits))
hannlen=(winlength*2)*maxfreq
hann=zeros(n,1)
//CreatehalfHanningwindow.
fora=1:hannlen
hann(a)=cos(((a*%pi)/hannlen)/2).^2
end
//TakeInverseFFTtotransfromtotimedomain.
fori=1:nbands
wave(1:length(real(fft(sig(:,i)))),i)=real(fft(sig(:,i)))
end
fori=1:nbands
forj=1:n
ifwave(j,i)<0then
wave(j,i)=wave(j,i)
end
end
freqq(:,i)=fft(wave(:,i))
end
fori=1:nbands
filtered(:,i)=freqq(:,i).*fft(hann)
output(:,i)=real(ifft(filtered(:,i)))
end
endfunction

Module:timecomb.sci
function[output]=timecomb(sig,acc,minbpm,maxbpm,bandlimits,maxfreq)
output=[]
[%nargout,%nargin]=argn(0)
mode(0)
ieee(1)
if%nargin<2thenacc=1end

if%nargin<3thenminbpm=60end
if%nargin<4thenmaxbpm=240end
if%nargin<5thenbandlimits=[0,200,400,800,1600,3200]end
if%nargin<6thenmaxfreq=4096end
n=max(size(sig))
nbands=max(size(bandlimits))
npulses=3
fori=1:nbands
dft(1:length(fft(sig(:,i))),i)=fft(sig(:,i))
end
sbpm=100
maxe=0
forbpm=minbpm:acc:maxbpm
e=0
fil=zeros(n,1)
nstep=floor((120/bpm)*maxfreq)
percent_done=100*(bpmminbpm)/(maxbpmminbpm)
fora=0:npulses1
temp=a*nstep+1
fil(temp)=1
end
dftfil=fft(fil)
fori=1:nbands
x=abs(dftfil.*dft(:,i)).^2
e=e+sum(x,firstnonsingleton(x))
end
ife>maxethen
sbpm=bpm
maxe=e
end
end
output=sbpm
endfunction

OUTPUTS:

Executionthemainfunction:

ConvolutionOutput:

SongOutputValues:

OriginalSongandBeatsOutputrepresentationinWindowsMediaPlayer:

OriginalSongTimevsFrequencyPlot:

BeatsOutputTimevsFrequencyPlot:

Das könnte Ihnen auch gefallen