Зависит от того есть ли там аналог pwelch(), как самого геморного компонента для реализации самому (я знаю т.к. делал в математике такое). rceps() можно заменить, как я и показал в первом сообщении.
Я же не буду проверять каждый открытый проект на вшивость
Кому интересно пусть повторит это в другом пакете и выложит наработки сюда, если получится.
Octave был выбран из-за максимальной совместимости с матлабом, где я знал как надо сделать нужное.
Так-то вроде PSD-estimation (Power spectral density estimation) в Scilab`е есть, наверно и там можно тогда:
http://www.scilab.org/scilab/features/scilab/signal_processingPSD это то же самое что и pwelch() делает.
Вот код для SciLab:
[target,fs] = wavread('H:\Backup\Audio\Clang test\Fortin.wav');
source = wavread('H:\Backup\Audio\Clang test\CCS_RG75R.wav');
nfft = 2^nextpow2(fs);
target_spectrum=pspect(nfft/2,nfft,'kr',target,8);
source_spectrum=pspect(nfft/2,nfft,'kr',source,8);
matching_spectrum = sqrt(target_spectrum./source_spectrum);
cepst=ifft(log(abs(matching_spectrum)));
cepst(2:nfft/2)=2*cepst(2:nfft/2);
cepst(nfft/2+2:nfft)=0;
mpimp=real(ifft(exp(fft(cepst))));
mpimp=mpimp/max(abs(mpimp));
wavwrite(mpimp,fs,32,'H:\Backup\Audio\Clang test\CCS_RG75R_to_Fortin_imp_scilab.wav');
В отношении SciLab стоит сказать что его лучше поставить с опциями по умолчанию, а то я выбрал другую версию FFTW, и была стабильно ошибка в одном месте. Переменная cepstrum была cepst, т.к. есть одноимённая функция (которая не даёт того что нужно, проще использовать общий подход), ну и гомоморфный фильтр решил опустить, сразу модифицировав кепстр.
Модифицированный интерактивный вариант:
ToneMatching_SciLab_v2.txt (0.53 КБ - загружено 113 раз.)
[source,fs] = wavread(uigetfile("*.wav","","Select Source"));
target = wavread(uigetfile("*.wav","","Select Target"));
nfft = 2^nextpow2(fs);
target_spectrum=pspect(nfft/2,nfft,"kr",target,8);
source_spectrum=pspect(nfft/2,nfft,"kr",source,8);
matching_spectrum = sqrt(target_spectrum./source_spectrum);
cepst=ifft(log(abs(matching_spectrum)));
cepst(2:nfft/2)=2*cepst(2:nfft/2);
cepst(nfft/2+2:nfft)=0;
mpimp=real(ifft(exp(fft(cepst))));
mpimp=mpimp/max(abs(mpimp));
wavwrite(mpimp,fs,32,uiputfile("*.wav","","Select Output"));
Для выполнения надо выбрать File->Execute... и далее следить за названием диалогов
Можно сказать что SciLab будет даже проще, весит в два раза меньше (дистрибутивы примерно схожие, учитывая что инсталлятор потом ещё кое-что докачает, для инсталляции требует 500 Мб). Так же интерфейс более дружественный, не отдаёт юниксом
Короче говоря, спасибо
AlexPA за наводку.