Springen naar inhoud

Muziek opsplitsen in drie frequentiebanden.


  • Log in om te kunnen reageren

#1

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 21 november 2009 - 13:08

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):
[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:
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];

[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:
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:
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.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

robertje

    robertje


  • 0 - 25 berichten
  • 18 berichten
  • Gebruiker

Geplaatst op 21 januari 2010 - 13:00

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?

#3

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 21 januari 2010 - 20:52

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:

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:
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-





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures