Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WAV - TimeStreatch (сжатие звука по времени) ...


Страницы:   1 2

Wm.DIGGER ©   (2006-05-03 12:53:00) 

Господа, подскажите пожалуйста. Мне нужно реализовать алгоритм TimeStreatch - сжатие звука по времени ... т.е. допустим время звучания wav-файла 3 сек. мне нужно сделать чтобы оно было 2,5 сек. Эта функция есть почти во всех звуковых редакторах и в каждом используется свой алгоритм, но вот описания хотябы одного алгоритма я нигде не нашёл ...

Пошёл самым простым путём: решил рассчитать коэффициент (шаг) и просто выбросить семплы в соответствие с этим шагом ... т.е. скажем из 3 сек. сделать 2,5 при частоте 48000Гц 16 bit Mono ... после расчётов получил шаг = 4 ... т.е. отбрасываю каждый 4-тый семпл последовательности ...

ок - получаю новый wav-файл продолжительностью 2,5 сек ...
но вот голос (в файле был записан голос) :)))) голос становится "писклявым" :) т.е. искажается ...

я понимаю, что сделанное мной мягко говоря "тупо" :)
подскажите, как выполнить сжатие по времени и получить звук без искажений ... ?


Хозяин   (2006-05-05 17:33:00) [1]

Wm.DIGGER ©

Хотите победить в перебранке или решить задачу?


Jeer   (2006-05-05 17:06:00) [2]

Держи алгоритм, кролик.

А на твои пацанские привычки всем здесь наплевать.
Подонком был, им же и будешь.

Будешь упорсттвовать дальше - запущу процесс твоей идентификации.
Это легче сделать, чем ты думаешь.
Сделаю это через официальный запрос администрации твоего региона.
Дальше провайдер, анкетные данные, милиция..

Могут быть неофициальные и продолжения этой истории.

function [S] = vocoder(E,Nfft,over,alpha)

% Phase vocoder time-scaling :

% - E     : input vector
% - Nfft  : size per frame
% - over  : overlapp ( between 0 et 1 )
% - alpha : time-expansion/compression factor ( alpha < 1 : compression; alpha > 1 : expansion ).
%
%===================================================================%
% The synthesis signal's length isn't exactly alpha*input's length. %
%===================================================================%

% Verifiy the overlapp

if( over < 0 | over >= 1 )
  error('error : overlapp must be between 0 and 1');
end;

if ( alpha <= 0)
   error('alpha must be strictly positive');
end;

E    = E(:);
N    = length(E);
Nfft = 2^(nextpow2(Nfft));

% Computing vocoder's parameters :
% - La        : number of samples to "advance" for each anamysis frame : analysis hop size.
% - nb_frames : number of frames to compute
% - Ls        : number of samples ot "advance" for each synthesis frame : synthesis hop size.
% - S         : S is the result vector
% - h         : hanning window

La        = floor((1-over) * Nfft);
nb_frames = floor((N-Nfft) / La);
max    = (nb_frames-2)*La + Nfft;
ls        = floor(alpha * La);

S         = zeros(floor(max*alpha),1);
h         = hanning(Nfft);

% Init process :

X     = h.*E(1:Nfft);
tX    = fft(X,Nfft);
Phis1 = angle(tX)
Phia1 = Phis1;

for loop=2:nb_frames-1
 
   %===============================================================================
   % ( classic analysis part of a phase vocoder )
   
   % Take a frame, and windowing it
   
   X  = h.*E((loop-1) * La + 1:(loop-1)*La + Nfft);
 
   % XI is the amplitude spectrum, and Phia2 the phase spectrum.
   
   tX    = fft(X, Nfft);
Xi    = abs(tX);
   Phia2 = angle(tX);
   
   %================================================================================
   % the part which actually does the time scaling
   
   % One compute the actual pulsations, and shift them. The tricky part is here...
   
   omega = mod( (Phia2-Phia1)-2*pi*([0:Nfft-1].')/Nfft * La + pi, 2*pi) - pi;
   omega = 2 * pi * ([0:Nfft-1].') / Nfft + omega / La;
   Phis2 = Phis1 + lss_frame*omega;

   % The new phases values  :
   
   Phis1 = Phis2;
   Phia1 = Phia2;
   
   %==============================================================================
   %  Synthetise the frame, thanks to the computed phase and amplitude spectrum :
   % ( classic synthetisis part of a phase vocoder )
   
   tfs = Xi.*exp(j*Phis2);
   Xr  = real(ifft(tfs)).*h;
   
   % overlapp-add the synthetised frame Xr
   
   S((loop-1)*lss_frame+1:(loop-1)*lss_frame+Nfft) ...
     = S((loop-1)*lss_frame+1:(loop-1)*lss_frame+Nfft) + Xr;
   
end;


Wm.DIGGER   (2006-05-05 16:40:00) [3]

Удалено модератором
Примечание: MAT RO на 3 дня, для начала


Сергей М.   (2006-05-05 15:43:00) [4]


> Wm.DIGGER ©   (05.05.06 13:31) [27]


> я говорю с подростком


Вот засранствовать, "аспирант", явно не в твоих интересах, если ты хочешь реальной помощи.
А ее в виде кода не будет, пока ты либо не прекратишь засранские выапды либо не обозначишь сумму за реализацию того самого якобы "готового" алгоритма, который ты в силу аспирантского развития своего мозжечка не можешь реализовать самостоятельно.

И, умоляю тебя, пацанствуй в подворотне, а не здесь.


Wm.DIGGER   (2006-05-05 15:38:00) [5]

Удалено модератором


Jeer   (2006-05-05 15:26:00) [6]

Wm.DIGGER ©   (05.05.06 15:08) [31]

Удачи !
Кроликовод-кандидат.

Посмешил еще раз.


Wm.DIGGER   (2006-05-05 15:08:00) [7]

Удалено модератором


Wm.DIGGER   (2006-05-05 14:54:00) [8]

Удалено модератором


Wm.DIGGER   (2006-05-05 14:33:00) [9]

Удалено модератором


Jeer   (2006-05-05 14:19:00) [10]

Wm.DIGGER ©   (05.05.06 13:31) [27]


> а уже давно защитился ...


Вообще-то сомневаюсь, ты обитаешь на игровых форумах - "кандидат".
Впрочем, цена многим современным диссерам - ломанный грош.

Я тоже защитился, только намного раньше.
Более того, много лет работал именно в области DSP (цифровая обработка сигналов)
Однако с моей защиты дивиденды были и будут, а с твоей - не видно,
разве, что кроликов ты разводил в своем диссере.


> я хотел только реализовать уже имеющийся, заметь простейший
> вариант!


Значит ты вообще ничего не понимаешь в той области куда пытаешься влезть.
Тем более надо начать с чтения литературы и тематических сайтов.

Как тебе будет заява "кроликовода" - решил, дескать по быстрому построить маленькую атомную станцию на своем кролико-городе.
Подскажите мне самый простейший вариант и желательно изготовьте.

"За парту"


Wm.DIGGER   (2006-05-05 13:31:00) [11]

про какие-то бабки базарит
"Базарят" на базаре "аспирант".
Либо братки, но ты мелковат для них.
Тебе нужен код - мне не помешают деньги.
Честное предложение.
Или ты халявщик ?
Как я сразу не догадался ?
Не знаешь, что бывает халявщикам за наглость и "базар" ?


ох, боже ...
кажется я начинаю понимать ...
я говорю с подростком ...
другого объяснения каких-то глупых угроз и выссказываний просто нет ...
а если это не так и ваш возраст указан верно ...
видимо это называется другим словом :)

p.s. кстати, а уже давно защитился ... так что завязывай(те) с "аспиратном" ... :)


Wm.DIGGER   (2006-05-05 13:17:00) [12]

Удалено модератором


Jeer   (2006-05-05 13:06:00) [13]


> про какие-то бабки базарит


"Базарят" на базаре "аспирант".
Либо братки, но ты мелковат для них.

Тебе нужен код - мне не помешают деньги.
Честное предложение.
Или ты халявщик ?

Как я сразу не догадался ?

Не знаешь, что бывает халявщикам за наглость и "базар" ?


Jeer   (2006-05-05 13:03:00) [14]

Wm.DIGGER ©   (05.05.06 12:43) [23]

Давай дальше - ты много знаешь определений, будет на чем учиться, таким как ты.


> не простой набросок кода, а результат проб .


бестолковых проб, заметим.

DSP - это целая отрасль математики и физики, не зная их основ ты взялся кодить ?

Смеши дальше.

Как известно, миллион обезьян за миллион лет тыкая в клавиши пиш.машинок теоретически могут повторить книгу "Война и мир".

Пробуй дальше.


Wm.DIGGER   (2006-05-05 12:43:00) [15]

Удалено модератором


Jeer   (2006-05-05 12:28:00) [16]

Wm.DIGGER ©   (05.05.06 12:20) [21]

Как Вы меня назовете - мне безразлично.

Вы не хотите учится, а занимаетесь бестолковым набросом кода и прослушиванием "чего вышло" из динамиков.

Мосг Вам в помощь, но в его неналичии, так же как и применимости определения "дурак" к Вам - я не сомневаюсь.

Будете хамить дальше - найдем и поправим ситуацию.


Wm.DIGGER   (2006-05-05 12:20:00) [17]

Удалено модератором


Jeer   (2006-05-05 12:18:00) [18]


> собственно могу даже упростить задачу ...
> я дам процедуру БПФ (FFT) ...


Вот "осчастливил", надо же.


Jeer   (2006-05-05 12:16:00) [19]

Wm.DIGGER ©   (05.05.06 11:07) [17]

А с таким гонором, как у тебя, "аспирант", ты вообще ничего не дождешься.

За тебя делать никто не будет, разве, что деньги получать.

А так - выложи 300 баксов, будет рабочий код time stretch.
Не MPEX, но работать будет.

А иначе - мимо проходи.
Или начни моск искать.


Wm.DIGGER   (2006-05-05 11:34:00) [20]

to programania

вот попытался так ... получилась вообще жопа ... собственно и треск и голос высокий :)


type pDub = array[0..1023] of Double;

procedure FFTS(var FFTWindow:pDub; FFTWindowSize, DMSize:LongInt);
var
 dx,
 dxx,
 Rex, //действ. часть частотного спектра
 Imx:pDub //мнимая часть частотного спектра
 risize:integer;
 i,j:longint;
begin
 RISize := FFTWindowSize div 2;
 for i := 0 to FFTWindowSize - 1 do dx[i] := FFTWindow[i];

 for i := 0 to RISize do begin Rex[i] := 0; Imx[i] := 0; end;

 // фурье прямое
 for j := 0 to RISize do
 for i := 0 to FFTWindowSize - 1 do
  begin
   Rex[j] := Rex[j] + dx[i] * cos(2*pi*j*i/FFTWindowSize);
   Imx[j] := Rex[j] - dx[i] * sin(2*pi*j*i/FFTWindowSize);
  end;

 // пересчёт амплитуд под новый размер массива
 for j := 0 to RISize do
  begin
   Rex[j] := Rex[j] / (DMSize / 2);
   Imx[j] := -Imx[j] / (DMSize / 2);
  end;

 Rex[0] := Rex[0] / 2;
 Rex[RISize] := Rex[RISize] / 2;

//чистим аккумулятор
 for i := 0 to FFTWindowSize - 1 do dxx[i] := 0;

 //фурье обратное
 for j := 0 to RISize do
 for i := 0 to DMSize - 1 do
  begin
   dxx[i] := dxx[i] + Rex[j] * cos(2*pi*j*i/DMSize);
   dxx[i] := dxx[i] + Imx[j] * sin(2*pi*j*i/DMSize);
  end;

 for i := 0 to DMSize - 1 do FFTWindow[i] := trunc(dxx[i]);
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо