При выполнении TSM для аудиофайла, почему появляется ошибка «слишком много выходных аргументов»? - PullRequest
0 голосов
/ 22 мая 2019

Я хочу применить TSM (изменение масштаба времени) к аудиофайлу, и этот аудиофайл уже имеет водяные знаки с изображением, и код для этого приведен ниже: Часть кода, вызывающая функцию TSM

if ok_TSM_w
    %TSM with Stftm
    alp_t = 1.8;
    yW = tsm_using_stftm(y1,alp_t);
    audiowrite('tsm_w.wav', yW,Fs);
    disp(' TSM of watermaked audio has been done')
end

tsm_using_stftm код:

function [xfinal] = tsm_using_stftm(filename, scale)
% Usage:
% tsm_using_stftm('sp01.wav', 1.5)


%[x,Fs] = audioread(filename);
x = filename;
%Fs = freq;
sent_L = length(x);

if scale>2 || scale<0.5
    scale = 1.5;
    fprintf('scale has to be in [0.5 2].\n scale is reset to be 1.5.\n')
end

L       = 256; %frame length
S       = L/4; %hop size
m_S     = round(S/scale);
overlap = L - S;
Nframe  = floor((sent_L-overlap)/S);

a       = 0.50;
b       = -0.50;
n       = 1:L;
win     = sqrt(S)/sqrt((4*a^2+2*b^2)*L)*(a+b*cos(2*pi*n/L));
win     = win(:);
Nit     = 5;

L_recon = round(sent_L/scale);
xfinal  = zeros(L_recon,1);

U = sum(win)/(m_S);

k = 1;
kk = 1;
h = waitbar(0,'Please wait...');
for n = 1:Nframe
    frm = win.*x(k:k+L-1)/U;
    xSTFTM = abs(fft(frm));

    if kk+L-1<=L_recon
        res = xfinal(kk:kk+L-1);
    else
        res = [xfinal(kk:L_recon);zeros(L - (L_recon-kk+1),1)];
    end
    x_recon = iterated_recon(xSTFTM, res, Nit, win);

    if (kk+L-1<=L_recon)
        xfinal(kk:kk+L-1) = xfinal(kk:kk+L-1) + x_recon;
    else
        xfinal(kk:L_recon) = xfinal(kk:L_recon) + x_recon(1:L_recon-kk+1);
    end
    k = k + S;
    kk = kk + m_S;
    waitbar(n/Nframe, h)
end

close(h)


% outfile = [filename(1:end-4),'_recon.wav'];
% audiowrite(xfinal, Fs, outfile);


function x_recon = iterated_recon(xSTFTM, x_res, Nit, win)

j = sqrt(-1);
for i = 1:Nit
    phi = phase(fft(win.*x_res)) + randn(size(x_res))*0.01*pi; 
    % random phase purturbation will reduce some resonance.
    % added by Yang Lu
    x = xSTFTM.*exp(j*phi); %M-constraint
    x_recon = ifft(x);
    x_res = real(x_recon);
end

x_recon = x_res;

но я получил ошибку:

Ошибка при использовании tsm_using_stftm

Слишком много выходных аргументов.

Ошибка в Audio_watermarking (строка 378)

yW = tsm_using_stftm (y1, alp_t);

Почему я получаю эту ошибку и как ее решить.Большое спасибо за помощь в этом и простите за ошибки, о которых идет речь.

Обновление 1

пробовал другим методом (TSM Toolbox)

код для вызова функции TSM:

if ok_TSM_wsola
    %TSM with waveform similirity overlap add
    alpha_tsm = 1.8;
    yWSOLA = wsolaTSM(y1,alpha_tsm);
    audiowrite('tsm_wsola.wav', yWSOLA,Fs);
    disp(' TSM of watermaked audio has been done')
end

и используется функция wsolaTSM.m, а ниже ссылка MATLAB ToolBox

и сподход, он выдал ошибку:

Индекс превышает границы массива.

Ошибка в wsolaTSM (строка 153) natProg = xC (currAnaWinRan + ...% «Естественная прогрессия»

Ошибка в Audio_watermarking_sbr_2015 (строка 378) yWSOLA = wsolaTSM (y1, alpha_tsm);

Пожалуйста, предоставьте любые предложения для этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...