|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : …ўЈҐЁ© Њ иҐа®ў 2:5020/175.2 05 Nov 2001 22:30:36 To : Aleksey V Vaneev Subject : FFT -------------------------------------------------------------------------------- Fri Nov 02 2001 23:06, Aleksey V Vaneev wrote to All: AVV> Кто-нибудь занимался обработкой звуковых потоков? Вот я попробовал AVV> сделать простенький эквалайзер, но наткнулся на непонятки... В общем, AVV> есть процедуры прямого и обратного FFT. Если значения окна не изменять, AVV> то прогон дает исходный файл. Использую линейную интерполяцию окон с AVV> наложением 60-80%. Это еще один момент непонятный - такое ощущение, что AVV> такая интерполяция порождает какие-то дефектные гармоники. В общем, AVV> после FFT у меня имеется набор вещественных и мнимых компонент. Основной AVV> вопрос - как изменить оные, чтобы все было правильно? Hапример, мощность AVV> 1-й гармоники мне хочется уменьшить на 6 дб. Что нужно менять? Честно AVV> говоря, не очень четко я понимаю как это делается. Элементарный AVV> эксперимент с обнулением обеих компонент 1-й гармоники дает какой-то AVV> "металлический" призвук, тон которого меняется от процента наложения AVV> окон. В приложение к моему ответу... procedure EqualData(var Buffer:array of double;var OldBuf:array of double;Weights:array of double); { Основной шаг эквалайзера: Buffer[0..255] 256 значений сигнала на входе эквалайзера и на выходе OldBuf[0..255] рабочий вектор(256 точек), содержащий остаток после предыдущего шага. Вначале нужно установить в ноль, затем он устанавливается эквалайзером Weights[0..255] вектор весов (коэффициентов усиления) для всех 256 частот } var i:integer; Ar,Ai:array[0..511] of double; begin for i:=0 to 255 do begin Ar[i]:=Buffer[i]; Ar[i+256]:=0; Ai[i]:=0; Ai[i+256]:=0; end; // Прямое БПФ fft(Ar,Ai); for i:=0 to 255 do begin Ar[i]:=Ar[i]*Weights[i]; Ar[511-i]:=Ar[511-i]*Weights[i]; Ai[i]:=Ai[i]*Weights[i]; Ai[511-i]:=Ai[511-i]*Weights[i]; end; // Обратное БПФ той же процедурой for i:=0 to 511 do begin Ar[i]:=Ar[i]/512; Ai[i]:=-Ai[i]/512; end; fft(Ar,Ai); for i:=0 to 255 do begin Buffer[i]:=Ar[i]+OldBuf[i]; if Buffer[i]>32765 then Buffer[i]:=32765; if Buffer[i]<-32765 then Buffer[i]:=-32765; OldBuf[i]:=Ar[i+256]; end; end; Евгений Машеров АКА СанитарЖеня --- ifmail v.2.15 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/3300f9b6b32e.html, оценка из 5, голосов 10
|