Autor Beitrag
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 28.02.06 12:42 
Hallo.

Ich brauche für den MIF (MusicInfoFinder) einen gescheiten Algorithmus. Bis jetzt arbeite ich mit der Bass.dll und habe das ganze so gemacht:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
function TMainForm.AnalyzeSong(Song: PChar): Extended;
var
  FFTData: TFFTData;
  FreqSch: Integer;
  Round:   Integer;
  Teiler:  Integer;
  SChan:   DWord;
begin
  SChan := BASS_StreamCreateFile(False, Song, 00,
             BASS_STREAM_DECODE AND BASS_STREAM_AUTOFREE);

  BASS_SetConfig(BASS_CONFIG_BUFFER, 5000);

  try
    Result := 0;
    Round  := 0;
    Teiler := 0;

    while (Result = 0OR (Round < 10000do
    begin
      BASS_ChannelGetData(SChan, @FFTData, BASS_DATA_FFT2048);

      for FreqSch := 0 to 1023 do
        Result := Result + (FFTData[FreqSch] * 44100 / 1024);

      if not (Result = 0then
      begin
        inc(Round);
        inc(Teiler, 1024);
      end;
    end;

    Result := Result / Teiler;
  except
    Result := 0;
  end;

  BASS_SetConfig(BASS_CONFIG_BUFFER, 500);

  BASS_ChannelStop(SChan);
  BASS_StreamFree(SChan);
end;

(FFTData = Array of DWORD)

Aber jede Analyse vom selben Song, gibt mir einen anderen Wert aus. Woran liegt das? Ich müsste es erstmal hinbekommen, dass jedesmal der selbe Wert rauskommt.

Danach muss ich mich dann um nen gescheiten Algo kümmern.

Gruß
GTA-Place

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am Di 25.02.14 17:07, insgesamt 2-mal bearbeitet
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 28.02.06 12:50 
Ein Logarithmus ist eine Mathematische Funktion, siehe auch: de.wikipedia.org/wiki/Logarithmus
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 28.02.06 13:23 
Einen kleines Teil des Frequenzbereichs dazu verwenden, Musikstücke zu vergleichen, halte ich für wenig sinnvoll. Wenn dann solltest du das über einen größeren Bereich hinwegmachen; wobei der Frequenzbereich sowieso nichtssagend sein kann - wenn du einmal mit 64 und einmal mit 128kBit kodierst und dir den Frequenzbereich ansiehst, wirst du sehen, was ich meine.

AXMD
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 01.03.06 00:20 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function TMainForm.AnalyzeSong(Song: PChar): Extended;
var
  FFTData: TFFTData;
  FreqSch: Integer;
  Round:   Integer;
  SChan:   DWord;
begin
  SChan := BASS_StreamCreateFile(False, Song, 00, BASS_STREAM_DECODE);

  try
    Result := 0;
    Round  := 0;

    while (Result = 0OR (Round < 100do
    begin
      BASS_ChannelGetData(SChan, @FFTData, BASS_DATA_FFT2048);

      for FreqSch := 0 to 1023 do
        Result := Result + FFTData[FreqSch];

      if not (Result = 0then
        inc(Round);
    end;

    Result := Result / (1024 * 100);
  except
    Result := 0;
  end;

  BASS_StreamFree(SChan);
end;


Jetzt kommt wenigstens immer das selbe raus für die gleiche Datei.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 01.03.06 11:49 
Erhälts du die Musik digital oder analog. Denn eine Fouriertransformation ist eine exakte Mathematische Abbildung und sollte immer zu gleichen Resultaten führen, ebenso genähert über eine schnelle Fouriertransformation (FFT), da der Algorithmus immer das gleiche tuen sollte. Wenn du also andere Fourierkoeffizienten erhälst würde ich zunächst da weiterstöbern. Ein Vergleich verschiedener Musiksongs über die Fourierkoeffizienten würde ich zunächst nicht als abwegig definieren, allerdings würde ich mich für deren Analyse bei Instrumenten wie der Varianz relativ zum Mittelwert bedienen. Vielleicht das ganze vorher noch logarithmieren (wegen der Frequenz-Tonhöhe-Abhängigkeit).

Edit: Sorry hab Kommentar unter dem letzten Beitrag nicht gelesen. Macht meine Ausführungen aber nicht nichtig, sondern nur schon gelöst. Nehme mal an, dass es sich dann auschließlich um digitale Musik handelt.
Ich würde jetzt vorschlagen, dass du ein Lied mal um ne Oktave transponierst und dir dann die Koeffiezienten anschaust. Würde mal nen Bischen rumstöbern, wie die sich verhalten.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 02.03.06 05:15 
Ich würde dir aber abraten anzufangen einfach irgendetwas zu tun und daraus irgendwie irgendetwas zu basteln. Denn wenn du nicht genau weisst, was du tust, wird es schlussendlich nicht (oder nur extrem schlecht) funktionieren und du wirst am Schluss nichts gelernt haben.

Digitale Signalverarbeitung erfordert gute mathematische Kenntnisse über komplexe Integrale, Faltungen von Funktionen, usw..

Eine Reihe von guten Papers findest du auf der Seite der "International Conference on Music Information Retrieval" (google).

PS: Die Bass.dll mag zwar schön sein und zudem einfach zu bedienen - die Ausgabe der Funktion BASS_ChannelGetData liefert aber ganz sicher kein FFT sondern wohl eher das Powerspektrum, dann noch irgendwie gestreckt und gerundet. Who knows. Jedenfalls würde ich stark bezweifeln, dass die für eine gute Musikerkennung geeignet ist. Ist wohl eher für ein bisschen "coole Graphik" in Musikplayern entworfen...
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 02.03.06 08:07 
user profile icondelfiphan hat folgendes geschrieben:
PS: Die Bass.dll mag zwar schön sein und zudem einfach zu bedienen - die Ausgabe der Funktion BASS_ChannelGetData liefert aber ganz sicher kein FFT sondern wohl eher das Powerspektrum, dann noch irgendwie gestreckt und gerundet. Who knows. Jedenfalls würde ich stark bezweifeln, dass die für eine gute Musikerkennung geeignet ist. Ist wohl eher für ein bisschen "coole Graphik" in Musikplayern entworfen...


Und wie gut geeignet ist fmod dafür? Also bringt es bessere Ergebnisse?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 02.03.06 21:50 
fmod? Kenn ich leider nicht.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 03.03.06 01:37 
Bass.dll hat folgendes geschrieben:
Retrieves the immediate sample data (or an FFT representation of it) of a stream or MOD music channel. Can also be used with a recording channel.


Ich check mal fmod ab.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 03.03.06 07:55 
@delfiphan: www.fmod.de oder www.fmod.org
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 03.03.06 10:57 
Theoretisch darf ich FFTData[0] nicht in den Schnitt hineinrechen (Phase), oder?

Mir scheint FMOD auf den ersten Blick professioneller zu sein, da FMOD sogar auf
XBOX, GameCube, PSP und bald auch auf PS3 läuft. Die Preise sind auch viel höher
als bei der Bass.dll. Werde FMOD heute mal testen.


EDIT: Schon keine Lust mehr -_-:
- keine Delphi-Examples
- FSound_Init kennt Delphi nicht

EDIT2: Nagut, bei Version 3 funktioniert es.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 03.03.06 21:58 
Zitat:
Retrieves the immediate sample data (or an FFT representation of it) of a stream or MOD music channel. Can also be used with a recording channel.
Bevor man eine FFT macht muss man das Signal zuerst mit einer Window-Funktion "filtern" (es gibt je nach Anwendung x verschiedene Fensterfunktionen), danach erst rechnet man die FFT aus. Die FFT liefert dann ein Resultat mit komplexen Zahlen. Aus der bass-Funktion bekommt man ein Array of DWord. Hier steht weder wie das Signal gefiltert wurde, noch was das Resultat eigentlich darstellt.

PS: Für eine Frequenzanalyse würde ich kein Geld aus dem Fenster werfen. Kostenlose FFT Routinen gibt's viele (z.B. hier: www.delphi-forum.de/viewtopic.php?t=36027).

Moderiert von user profile iconKlabautermann: URL-Tags hinzugefügt.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 04.03.06 01:17 
Die Bass.dll legt automatisch 'Hanning window' drüber.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)