Bert F
Artikelen: 0
Berichten: 2.589
Lid geworden op: vr 15 aug 2003, 20:37

Muziek opsplitsen in drie frequentiebanden.

Ik probeer een muziek bestandje van ongeveer 6 sec op te splitsen in zijn lage, middel en hoge tonen en dit als volgt(in matlab):

Code: Selecteer alles

[y FS Nbits OPTS]=wavread('C:\Users\Gebruiker\Documents\MATLAB\marco.wav');

[lengte brol]=size(y);
In lezen van de waardes in y en bepalen van de hoeveelheid samples in lengte.

met volgende waardes in volgende functie:

Code: Selecteer alles

fc=FS/6-1000/2; 

F=[0 fc];  %is de band ==>>dus van Ohz tot f afsnijd frequentie

% onderdruking 60db

lin=10^(-60)/20;

A=[1 0];   % [1 0] = laagdoorlaat

DEV=[];

DEV=[lin lin];

Code: Selecteer alles

[N,Wn,BTA,FILTYPE] = KAISERORD(F,A,DEV,FS);

B = FIR1(N, Wn, FILTYPE,  kaiser( N+1,BTA ), 'noscale' );
Hiermee bepaal ik dan de filter coeficieneten B waarna ik:

Code: Selecteer alles

laagdoorlaat=filter(B,1,y);
Dit geeft me de lage tonen (het is eigenlijk de bedoeling het spectrum op te splitsten in 3):

Dit af spelen lukt.

Nu wil ik de hoge tonen bepalen mbv het complementaire principe normaal zou Hoogspec=Alles-Laag maar omdat op Alles geen delay word toegepast doe ik dit op volgende manier:

Code: Selecteer alles

for floop=0 :freqr: FS

   delay(n)=exp((i*2*pi*floop)*(N/2)); 

   n=n+1;

end

MiddenHoog=(Y.*delay'-SpecLaag);
waarbij ik 1 sample van de delay weggooi omdat die anders niet overeenkomen.

Vraag: Het berekenen van die delay duurt enorm lang is dit wel een juiste manier? hoe kan ik dat beter doen? uiteindelijk hoor ik wel iets maar de ifft van het hoge spectrum is complex waardoor ik nog enkel het real deel mag nemen (dat lijk me ook een reden om aan te nemen dat er bij die delay iets fout zit) bijkomend zitten er verschuivingen in het hoog deel, het is niet meer waarheidsgetrouw.

Wie ziet waar ik de fout in gaan? Groeten.
robertje
Artikelen: 0
Berichten: 18
Lid geworden op: do 03 dec 2009, 09:54

Re: Muziek opsplitsen in drie frequentiebanden.

Ik ken dat programma verder absoluut niet,

Maar kun je misschien alle middel, en hoge tonen wegfilteren, dan de lage tonen die je overhoud opslaan.

dit doe je ook bij de middel en hoge tonen, en ze uiteindelijk alle 3 onder elkaar zetten of krijg je dan iets heel raars?
Gebruikersavatar
317070
Artikelen: 0
Berichten: 5.609
Lid geworden op: za 28 feb 2009, 17:05

Re: Muziek opsplitsen in drie frequentiebanden.

Bert F schreef:Nu wil ik de hoge tonen bepalen mbv het complementaire principe normaal zou Hoogspec=Alles-Laag maar omdat op Alles geen delay word toegepast doe ik dit op volgende manier:

Code: Selecteer alles

for floop=0 :freqr: FS

   delay(n)=exp((i*2*pi*floop)*(N/2)); 

   n=n+1;

end

MiddenHoog=(Y.*delay'-SpecLaag);
waarbij ik 1 sample van de delay weggooi omdat die anders niet overeenkomen.
Waar wordt n geïnitialiseerd?

Maar ik denk dat je het iets te ver zoekt. Is het de bedoeling dat die delay in het frequentiedomein zit? Je kunt ook gewoon dit doen:

Code: Selecteer alles

delay=exp(( (0:freqr:FS) *2*pi*floop)*(N/2));
Dan heb je het in 1 regel, zonder loop, of je kunt het in het tijdsdomein doen, dat is waarschijnlijk nog het eenvoudigst.
What it all comes down to, is that I haven't got it all figured out just yet

And I've got one hand in my pocket and the other one is giving the peace sign

-Alanis Morisette-

Terug naar “Informatica en programmeren”