WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Musikerkennung mit DFT oder FFT?

 

MatzeMeister
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2010, 18:19     Titel: Musikerkennung mit DFT oder FFT?
  Antworten mit Zitat      
Hallo zusammen
ich bin ein absolute Neuling bei Matlab und versteh grad noch a bisl Bahnhof

UNd zwar hab ich das Problem dass ich eine Musikerkennungsprogramm mit Matlab erstellen soll....
das heißt es müssen um die 20 songs eingelesen werden aus einer Datenbannk und dann wenn das Lied wieder kommt sollte es erkannt werden !?

Bitte helft mir hab echt kein Plan wie ich anfagen soll
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen


Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 07:27     Titel:
  Antworten mit Zitat      
hallo,

ich hatte mal ein ähnliches Projekt, allerdings spracherkennung, Sprecher mussten einen satz aussprechen und der Sprecher musste erkannt werden.
erstes verfahren war Frequenzanalyse:

ich würde vorschlagen von diesen 20 Lieder machst du FFT. und speicherst sie in einer matrix.

wenn jetzt ein neues lied kommt das du erkennen musst, du machst davon auch FFT und rechnest den LSE( least square error) und zwar mit allen 20 vorlagen die du schon gespeichert hast, und dann vergleichst du diese errors,
und wo der fehler am kleinsten war, das ist das gesuchte Lied.

gruss
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 08:46     Titel:
  Antworten mit Zitat      
also ich hab jetzt gradmal des
Code:
clear all;
start_time=cputime;


audio_input='test_track1.wav';


[data,Fs]=wavread(audio_input);

M=size(data,1);       % Fs is the sampling frequency
T=floor(M/Fs);        % duration of the analyzed audio data
NFFT=T*Fs;            % number of samples


data_fft=fft(data,NFFT) ;


whos -file lieddaten.mat

plot (data);


wie speicher ich dann alle in ner matrix?
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 09:33     Titel:
  Antworten mit Zitat      
du sagtest du es geht um 20 songs.
und das machst du bestimmt über eine for-schleife ungefähr so:

Code:

for i=1:20
audio_input=['test_Track' num2str(i) '.wav']
[data,Fs]=wavread(audio_input);
.
.
.
data_fft(:,i)=fft(data,NFFT) ;
 


dein audio_input wird jedes mal überschrieben, aber in data_fft sind dann alle eine ffts gespeichern, ´data_fft(:,1) ist fft(Track1).....usw
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 17:51     Titel:
  Antworten mit Zitat      
wenn ich das eingebe dann sagt er mir jedesmal dass er testrack11 nicht lesen kann

audio_input =

test_Track11.wav

??? Error using ==> wavread at 67
Cannot open file.

obwohl es eine wav datei ist und nicht beschädigt sprich ich kann sie anhören
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 20:18     Titel:
  Antworten mit Zitat      
gab keine probleme beim einlesen von test_Track1 bis 10?
ist der name der datei wirklich test_Track11, achte auf gross und klein Buchstaben..
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 20:35     Titel:
  Antworten mit Zitat      
also so gehts aber er zeigt mir nur den letzten plot an!? oder den ersten hat er dann doch nicht alles gespeichert?

Code:
clear all;
start_time=cputime;

for i=1:10
audio_input=['test_Track' num2str(i) '.wav']
   
%audio_input='test_track7.wav';


[data,Fs]=wavread(audio_input);

M=size(data,i);       % Fs is the sampling frequency
T=floor(M/Fs);        % duration of the analyzed audio data
NFFT=T*Fs;            % number of samples


data_fft =fft(data,NFFT) ;

%data_fft=fft(data,NFFT) ;

end
whos

plot (data_fft)
% bis hier gehts schon


wo hab ich denn wieder nen fehler reingehauen
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 20:42     Titel:
  Antworten mit Zitat      
natürlich zeigt er dir nur den letzten deine variable wird data_fft wird jedes mal überschrieben, füge einen index hinzu data_fft(:,i)... sieh das beispiel dass ich dir vorhin gezeigt habe.

ausserdem finde ich es geschickter beim plot, auch die x-achse anzugeben
sprich deine frequenzachse, aber räume erstmal die aktuellen fehler auf ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 20:56     Titel:
  Antworten mit Zitat      
jetzt kommt das problem!?

audio_input =

test_Track1.wav

??? Subscripted assignment dimension mismatch.

heißt dass meine datenmengen sind zu groß

Code:
clear all;
start_time=cputime;

for i=1:10
audio_input=['test_Track' num2str(i) '.wav']
   
%audio_input='test_track7.wav';


[data,Fs]=wavread(audio_input);

M=size(data,i);       % Fs is the sampling frequency
T=floor(M/Fs);        % duration of the analyzed audio data
NFFT=T*Fs;            % number of samples


%data_fft =fft(data,NFFT) ;

data_fft(:,i)=fft(data,NFFT) ;

end
whos

plot (data_fft)
% bis hier gehts schon


de plotten is eh nur für mich...is noch nicht so wichtig...
wie gesagt will alle einlesen dann zwischen speichern und dann mit einem track vergleichen den ich einles und dann soll er sagen welcher es is!
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 21:07     Titel:
  Antworten mit Zitat      
hmmm jetzt fällt mir ein, brauchst du für diesen zweck überhaupt fft, du kannst auch im zeitbereich vergleichen, du kannst ein bestimmten interval vergleichen die ersten 100 werte zumbeispiel...

zu deinem problem gerade weiss ich nicht, gerade hats funktioniert oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 21:09     Titel:
  Antworten mit Zitat      
muss nicht unbedingt mit fft sein aber dann bin ich überfragt was ich machen soll...


hast du da ne idee?

und soweit ich weiß wird in der digitalen signalverarbeitung nur mit fft´s gearbeitet!?
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 15.06.2010, 22:17     Titel:
  Antworten mit Zitat      
probier mal diesen code, musst halt pfad und so ändern:

Code:

clear data;
file='C:\Dokumente und Einstellungen\Besitzer\Desktop\ordner';
for i=1:20
    audio_input=fullfile(file,['test_Track' num2str(i) '.wav']) ;
    data{i,:}=wavread(audio_input);
end

%jetzt ein neues lied lesen und vergleichen
[name path]=uigetfile('\*.wav');
test=wavread(fullfile(path,name));

for i=1:20
    if(data{i}(1:50)==test(1:50))
        x=i;
        break
    end
end
disp(['es war test_Track: ', num2str(x)])
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2010, 05:59     Titel:
  Antworten mit Zitat      
Hey Super funtioniert nicht schlecht nur
haut des vergleichen noch nicht so ganz hin weil er teilweise wenn ich bsp. das Lied 10 auswähle anzeigt dass es Lied neun ist?????

aber ansonsten nicht schlecht

hast du noch ne idee wie man des rauskriegt oder ne bessere trefferwahrscheinlichkeit hat?
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 17.06.2010, 08:15     Titel:
  Antworten mit Zitat      
ich glaub ich weiss woran es liegt, wenn man einen song spielen lässt, dann ist in den ersten sekunden nix erst danach fängts an.
und in der if-schleife vergleichen wir die ersten 50 werte, die gefahr ist gross dass bei vielen songs die ersten 50 werte gleich sind.

Lösung: entweder du nimmst mehr werte zum vergleich 1:1000 von mir aus, bis es passt, oder am besten du nimmst werte von der mitte, 500:600 zum beispiel, da ich bezweifle dass die mittleren werte der 20 songs gleich sein können, und spart zeit da wir nur 100 werte gleichen statt 1000 am anfang.

also if schleife ändern
Code:

if(data{i}(500:700)==test(500:700))


nimm halt mehr werte wenn es nicht reicht...

viel glück
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
MatzeMeister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2010, 15:01     Titel:
  Antworten mit Zitat      
ja funktioniert viel besser habs jetzt so weit fertig aber funktioniert halt nur bis zu 10 songs weil dann wieder ne Fehlermeldung kommt ab Lied 11


??? Index exceeds matrix dimensions.

heißt er brauch wahrscheinlich zu viel Speicherplatz
_________________

Ne is klar
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.