![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WAV - TimeStreatch (сжатие звука по времени) ...
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;