|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.12.2017, 17:02 | #1 |
Регистрация: 13.02.2013
Сообщений: 6
|
Смещение звукового спектра в FFT
Есть ли исходник на делфи прямого и обратного быстрого преобразования Фурье?
Нужно перевести частями вав файл в спектр Фурье потом сместить весь спектр по кольцу вправо или лево и назад превратить в вав файл как зависит максимальное значение амплитуды в БПФ от размера данных и количества байт в одном отсчете сигнала? |
13.12.2017, 17:18 | #2 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
https://github.com/merlinND/pascal-f...rier-transform http://www.delphisources.ru/pages/faq/base/fft.html и т.д. |
|
13.12.2017, 18:26 | #3 |
Регистрация: 13.02.2013
Сообщений: 6
|
в исходнике по 1 ссылке при компиляции пишет
в строчке function getBit(const Val: DWord; const BitVal: Byte): Boolean; [Error] fft.pas(152): Undeclared identifier: 'DWord' в исходнике по 2 ссылке при компиляции пишет if Depth TrigTableDepth then InitTrigTable(Depth); [Error] cplxfft1.pas(71): Type of expression must be BOOLEAN в этом исходнике не понятно какое максимальное значение будет иметь амплитуда. если брать звуковой файл и читать блоками потом делать БПФ на основе БПФ синтезировать частоты и на основании этого делать новый звуковой файл то громкость участков файла будет нарушена как ввести коэффициент который все спектры БПФ приведет к одинаковому масштабу. В звуковых редакторах БПФ показано в Дб как перевести данные с БПФ в Дб Последний раз редактировалось riddikooo; 13.12.2017 в 18:42. |
13.12.2017, 19:43 | #4 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Возьмите компилятор, в котором он уже опеределен, или доопределите сами. DWORD - это ж простой тип, а не какой-то супер класс.
Так у вас проблемы не только с программированием, но и теорией... Вы хотя представляете, что делает БПФ? Так без формул, напальцах? |
13.12.2017, 20:46 | #5 |
Регистрация: 13.02.2013
Сообщений: 6
|
компилятор делфи 7
примерно представляю берет байты перемешивает по алгоритму бабочка и каждому значению дает свой коэффициент нашел исходник вроде рисует в дб http://sources.codenet.ru/download/3594/fftSpectr.html только он берет данные с звуковой карты не могу понять как брать данные с файла если настроить на периоды в 1024 отсчета 16 бит моно как передать массив типа smallint чтобы стелало БПФ Последний раз редактировалось riddikooo; 13.12.2017 в 21:02. |
13.12.2017, 21:10 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Я ж просил без формул. Тем более, что бабочка это только один из шагов в одном из (пусть и популярном) алгоритме вычисления БПФ. Вот вы там про громкость говорили, Дб приплели... видимо не спроста...
В новых Делфях дворд объявлен как кардинал, вроде бы. Но ничего вам не мешает задать конкретный диапазон. |
14.12.2017, 10:45 | #7 |
Регистрация: 13.02.2013
Сообщений: 6
|
нашел исходник в котором такое БПФ
procedure FFT(var Amp: array of Double); var mm, ll, k, nn, kk, j, jj, i, nv2, nm1: Integer; C1, C2, C3: TComplex; RootExp: Integer; WSinTo: array of TComplex; S: Double; LenAmp: Integer; Spec: array of TComplex; begin LenAmp := Length(Amp); form1.Memo1.Lines.Add(inttostr(LenA mp)); S := 2 * PI / LenAmp; C1.Re := Cos(s); C1.Im := -Sin(S); C2.Re := 1; C2.Im := 0; SetLength(WSinTo, LenAmp); SetLength(Spec, LenAmp); for I := 0 to LenAmp - 1 do begin WSinTo[I] := C2; Mult(C2, C1, C2); end; RootExp := Round(Ln(LenAmp) / Ln(2)); mm := 1; ll := LenAmp; for K := 0 to LenAmp - 1 do begin Spec[K].Re := Amp[K]; Spec[K].Im := 0; end; for K := 1 to RootExp do begin nn := ll div 2; jj := mm + 1; i := 1; while (i <= LenAmp) do begin kk := i + nn; plus(Spec[i - 1], Spec[kk - 1], c1); minus(Spec[i - 1], Spec[kk - 1], Spec[kk - 1]); Spec[i - 1] := c1; i := i + ll; end; if (nn <> 1) then begin for j := 2 to nn do begin c2 := WSinTO[jj]; i := j; while (i <= LenAmp) do begin kk := i + nn; plus(spec[i - 1], Spec[kk - 1], c1); minus(Spec[i - 1], Spec[kk - 1], c3); mult(c3, c2, Spec[kk - 1]); Spec[i - 1] := c1; i := i + ll; end; jj := jj + mm; end; ll := nn; mm := mm * 2; end; end; nv2 := LenAmp div 2; nm1 := LenAmp - 1; j := 1; for i := 1 to nm1 do begin if (i < j) then begin c1 := Spec[j - 1]; Spec[j - 1] := Spec[i - 1]; Spec[i - 1] := c1; end; k := nv2; while (k < j) do begin j := j - k; k := k div 2; end; j := j + k; end; for K := 0 to LenAmp - 1 do Amp[K] := Sqrt(Sqr(Spec[K].Re / (LenAmp div 2)) + Sqr(Spec[K].Im / (LenAmp div 2))) end; может кто подскажет какое максимальное значение амплитуды здесь может быть как оно зависит от размера массива данных |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запуск библиотеки FFT C# | Krasi | Помощь студентам | 11 | 14.10.2015 17:26 |
FFT - инвертирование бит | MooNDeaR | Помощь студентам | 1 | 18.11.2013 18:37 |
FFT | asdbsa | Visual C++ | 3 | 22.09.2013 21:39 |
Частота и амплитуда FFT | WorldMaster | C# (си шарп) | 17 | 16.12.2012 17:58 |
Проблема с БПФ (FFT) | Teddy_bear | Общие вопросы C/C++ | 2 | 13.01.2012 18:13 |