Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

FFT Problem in verbindung mit WMP

  Alt 24. Mai 2007, 08:34
Hallo

Hier mal meine FFT Routine..

Delphi-Quellcode:
       
function BASS_WMPVIS_Render(channel: DWORD): boolean; stdcall;

      BASS_ChannelGetData(channel, Data32, FFTSize or
                          DWORD(IfThen(ChanInfo.chans = 2,
                          BASS_DATA_FFT_INDIVIDUAL)));
                          
      if (ChanInfo.chans = 2) then
      begin
        for i := 0 to 1023 do
        try
        begin
          VisData^.frequency[0, i] :=
            Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
          Inc(Data32Pos, FFT_SkipCount);

          VisData^.frequency[1, i] :=
            Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
          Inc(Data32Pos, FFT_SkipCount);
        end;
        except
          Result := false;
          exit;
        end;
      end
      else
      begin
        for i := 0 to 1023 do
        begin
          VisData^.frequency[0, i] :=
            Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
          VisData^.frequency[1, i] :=
            VisData^.frequency[0, i];
          Inc(Data32Pos, FFT_SkipCount);
        end;
      end;
      
      FreeMem(Data32);
      try
        _IWMPEffects.Render(VisData^, BassWMPVis1.ContainerHdc, pRect);
      except
        Result := false;
        exit;
      end;
      
      Result := true;
      BassFuncs^.SetError(BASS_OK);
      exit;
  end;

  Result := False;
  BassFuncs^.SetError(BASS_ERROR_MEM);

end;
Mein Problem ist nun das in dieser schleife bedingt durch TimedLevel
nur 1024 samples übergeben werden können.

Delphi-Quellcode:
      if (ChanInfo.chans = 2) then
      begin
        for i := 0 to 1023 do
        try
        begin
          VisData^.frequency[0, i] :=
            Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
          Inc(Data32Pos, FFT_SkipCount);

          VisData^.frequency[1, i] :=
            Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
          Inc(Data32Pos, FFT_SkipCount);
        end;
Im Original Quelltext wird aber ein VariablesArray erstellt
TimedLvl.frequency = new byte[2048];
in dem nun unabhängig von TimedLevel die Daten ausgelesen werden können.

Wie kann ich in meiner schleife den rechten Kanal trotzdem auslesen und die samples
von 1024 to 2048 übergeben damit kein rangecheck error auftritt ?

Code:
            // The first value is the DC component so we'll skip it and start at index 1
            for (int i = 1; i < 1024; i++)
            {
                try
                {
                    float val = (fft[i] * 255);

                    if (val < 0)
                        val = 0;

                    if (val > 255)
                        val = 255;

                    audioData[i] = (byte)val;
                    audioData[i + 1024] = (byte)val;
                }

                catch (Exception ex)
                {
                    Console.WriteLine("Exception occurred at index {0}", i);
                    return false;
                }
            }

            return true;
Zur zeit sieht es so aus das rechts und links die gleichen Daten übergeben werden.
Und seltsamer weise (wohl bedingt durch den rechten Kanal) einige Samples bei einigen Plugins fehlen.
Das sieht dann so aus siehe PIC die hellgrüne grundläsche die frei ist.
Müßte eigentlich mit Samples belegt sein.

Gruss Emil
Miniaturansicht angehängter Grafiken
hmm_196.jpg   wmppic_109.jpg  
  Mit Zitat antworten Zitat