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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2017, 17:02   #1
riddikooo
 
Регистрация: 13.02.2013
Сообщений: 6
По умолчанию Смещение звукового спектра в FFT

Есть ли исходник на делфи прямого и обратного быстрого преобразования Фурье?
Нужно перевести частями вав файл в спектр Фурье потом сместить весь спектр по кольцу вправо или лево и назад превратить в вав файл
как зависит максимальное значение амплитуды в БПФ от размера данных и количества байт в одном отсчете сигнала?
riddikooo вне форума Ответить с цитированием
Старый 13.12.2017, 17:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Есть ли исходник на делфи прямого и обратного быстрого преобразования Фурье?
Да целы воз, как говорит гугл.
https://github.com/merlinND/pascal-f...rier-transform
http://www.delphisources.ru/pages/faq/base/fft.html
и т.д.
p51x на форуме Ответить с цитированием
Старый 13.12.2017, 18:26   #3
riddikooo
 
Регистрация: 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.
riddikooo вне форума Ответить с цитированием
Старый 13.12.2017, 19:43   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Возьмите компилятор, в котором он уже опеределен, или доопределите сами. DWORD - это ж простой тип, а не какой-то супер класс.
Так у вас проблемы не только с программированием, но и теорией... Вы хотя представляете, что делает БПФ? Так без формул, напальцах?
p51x на форуме Ответить с цитированием
Старый 13.12.2017, 20:46   #5
riddikooo
 
Регистрация: 13.02.2013
Сообщений: 6
По умолчанию

компилятор делфи 7
примерно представляю берет байты перемешивает по алгоритму бабочка и каждому значению дает свой коэффициент

нашел исходник вроде рисует в дб
http://sources.codenet.ru/download/3594/fftSpectr.html
только он берет данные с звуковой карты не могу понять как брать данные с файла
если настроить на периоды в 1024 отсчета 16 бит моно
как передать массив типа smallint чтобы стелало БПФ

Последний раз редактировалось riddikooo; 13.12.2017 в 21:02.
riddikooo вне форума Ответить с цитированием
Старый 13.12.2017, 21:10   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Я ж просил без формул. Тем более, что бабочка это только один из шагов в одном из (пусть и популярном) алгоритме вычисления БПФ. Вот вы там про громкость говорили, Дб приплели... видимо не спроста...

В новых Делфях дворд объявлен как кардинал, вроде бы. Но ничего вам не мешает задать конкретный диапазон.
p51x на форуме Ответить с цитированием
Старый 14.12.2017, 10:45   #7
riddikooo
 
Регистрация: 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;

может кто подскажет какое максимальное значение амплитуды здесь может быть
как оно зависит от размера массива данных
riddikooo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск библиотеки 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