Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2011, 15:25   #1
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию Ошибка отображения файла после БПФ

Здравствуйте. Читал на форуме схожие темы, но проблему так и не могу решить. При выводе графика(спектра) wav файла после быстрого преобразования фурье выдает "Invalid floating point operation". До конца не могу понять, когда именно возникают проблемы подобного рода. Посмотрел значения счетчика с помощью F7 -- там только положительные значения. Где-то читал, что возможно у меня не стыкуются размер wav файла и массива, в который я загоняю туда данные и закидываю в процедуру FFT. Знающие люди, посмотрите/посоветуйте, пожалуйста.
sergobrit вне форума Ответить с цитированием
Старый 27.11.2011, 18:44   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
procedure Draw(Name: string);
var
  r : TWaveResult;
  i,j: integer;
  W1, W2 : SmallInt;

  fft:TDoubleArray;
  fs: TFileStream;
begin
  form1.fstlnsrsSeries1.Clear;
  form1.fstlnsrsSeries2.Clear;
  r := ReadWave(Name);
  r.Data.seek(0, soFromBeginning);
for i := 1 to r.Data.Size div 4
do Begin
    r.Data.readBuffer(W1, 2);
    r.Data.readBuffer(W2, 2);
    form1.fstlnsrsSeries1.AddXY(i*(2/8000),W1/16000);
end;


    fs:= TFileStream.Create(Name, fmOpenRead);

    SetLength(fft, n*2);
    fs.Read(Pointer(fft)^,SizeOf(Double)*n*2);
    fs.Free;

    FastFourierTransform(fft,n,False);
    for j:=0 to 2*n-1
    do begin
   Form1.fstlnsrsSeries1.Add(fft[j]);
    end;
end;
Поясните мне логику ваших действий, когда вы пытаетесь строить спектр из значений неразобранного файла (там не чистые отсчеты, а и служебная информация), а не из отсчетов двухканального WAV -файла (выделил жирным участок). Причем выше в коде для получения отсчетов вы его разбирали, а потом вдруг забыли.

Приведу пример. Отсчеты:
Код:
  inwav1.Clear; outwav1.Clear;

   r:= ReadWave(s);
   ch.Title.Text.Strings[0]:= 'File: ' + extractfilename(s) +
                              ' / Fd [Hz]= '  + floattostr(r.wSamplePerSec);
   //
   r.Data.seek(0, soFromBeginning);
   for i := 1 to r.Data.Size div 2 do begin
    r.Data.readBuffer(W1,1);
    r.Data.readBuffer(W2,1);
    inwav1.Add(W2);
    series2.Add(W2,'',rgb(255,0,0))
   end;




А теперь получение спектра с привязкой частоты:
Код:
outwav1.Clear;
  FFTQuad(inwav1, outwav1, 2048,false);

  //спектр и 2-x проходный поиск-
  amf1:= -1000;
  for i:= 0 to (outwav1.YValues.Count)-1 do begin //
   amf:= outwav1.YValues[i];
   fmf:= i / (outwav1.YValues.Count/2) * (r.wSamplePerSec / 2);
   series2.AddXY(fmf,amf,'',clblue);
   if amf > amf1 then begin amf1:= amf; fmf1:= fmf end                  //частота для 1-
  end;
  amf2:= -1000;
  for i:= (outwav1.YValues.Count)-1 downto 0 do begin
   amf:= outwav1.YValues[i];
   fmf:= i / (outwav1.YValues.Count/2) * (r.wSamplePerSec / 2);
   if (amf > amf2)and(amf<>amf1) then begin amf2:= amf; fmf2:= fmf end      //частота для 2-
  end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.11.2011, 23:00   #3
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Космическое спасибо за помощь и разъяснение кода для моего примера. Говоря про логику, уже никакой не осталось -- диплом, препод постоянно чего-то хочет, голова не думает, и никто не помогает. Нашел в инете этот пример разобранный. С вашими комментами думаю доведу все до ума. Какой-то график получил, правда, он немного отличается от того,если прогнать тот же файл через SPEKTRA, но это детали.
sergobrit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка отображения 3D модели Кинельски Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 01.11.2011 20:05
Ошибка отображения в TMemo v2.0 (delphi) dyonysos Помощь студентам 2 26.08.2009 22:48
Ошибка отображения в TMemo (delphi) dyonysos Помощь студентам 3 26.08.2009 22:23
Отображения Excel файла в StringGrid-е Demien Общие вопросы Delphi 6 16.04.2009 23:00
Выполнить действия после отображения формы zhefran Общие вопросы Delphi 15 14.08.2008 16:50