Автор Тема: DSP DIY (цифровая обработка своими руками)  (Прочитано 11040 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vasilius

  • Эксперт
  • *****
  • Сообщений: 2152
  • www.st-rock.com
    • st.Rock
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #15 : Января 31, 2013, 23:45:45 »
deLuther, слууушай, а ты случайно объясняешь не то же самое, что делает Kemper?
нет

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #16 : Февраля 01, 2013, 00:01:16 »
deLuther, слууушай, а ты случайно объясняешь не то же самое, что делает Kemper?
Разве что очень отчасти, один из аспектов, кемпер, помимо АЧХ, ещё и перегруз подгоняет.

Оффлайн PVDHP Vadim

  • Эксперт
  • *****
  • Сообщений: 2874
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #17 : Февраля 01, 2013, 08:44:54 »
Impulse maker 1000 lvl  :)

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #18 : Февраля 01, 2013, 14:04:24 »
Продолжу немного начатую тему.
Matlab это конечно хорошо, но было интересно как можно сделать то же со свободно распространяемыми средствами.
Как известно существует бесплатный эквивалент Matlab`а называемый Octave, причём общий синтаксис у них совпадает.
Так вот это же можно сделать и в нём.
http://wiki.octave.org/Octave_for_Windows
Скачал дистрибутивы отсюда: http://sourceforge.net/projects/octave/files/Octave%20Windows%20binaries/Octave%203.6.1%20for%20Windows%20MinGW%20installer/
Далее по инструкции распаковал сам основной пакет и дополнительные пакеты, из которых потребуется signal, в одну и ту же папку (маршрут не должен содержать пробелов и всяких русских символов), следует отметить что на всё уйдёт 1 Гб, хотя суммарно дистрибутив только на 200 Мб (но наука, как известно, требует жертв).
После этого запустил линг octave3.6.1_gcc4.6.2 в корне установочной папки.
Следующим шагом я выполнил команду
pkg rebuild -autoДля того чтобы подцепились дополнительные пакеты.
Далее код будет почти напоминать матлабовский за несущественными коррективами (приведу полный код, можно просто скопировать и вставить в коммандную строку для выполнения целиком, только предварительно надо изменить маршруты к файлам):
[target,fs] = wavread('H:\Backup\Audio\Clang test\Fortin.wav');
source = wavread('H:\Backup\Audio\Clang test\CCS_RG75R.wav');
nfft = 2^nextpow2(fs);
w = kaiser(nfft,8);
target_spectrum = pwelch(target,w,0.5,nfft,fs,'twosided');
source_spectrum = pwelch(source,w,0.5,nfft,fs,'twosided');
matching_spectrum = sqrt(target_spectrum./source_spectrum);
imp = ifft(matching_spectrum);
[y,mpimp] = rceps(imp);
mpimp = mpimp/max(abs(mpimp));
wavwrite(mpimp,fs,32,'H:\Backup\Audio\Clang test\CCS_RG75R_to_Fortin_imp_octave.wav');

Вот так вот и бесплатно  ;D
« Последнее редактирование: Февраля 01, 2013, 14:06:22 от deLuther »

Оффлайн NSb

  • Живу на форуме
  • *******
  • Сообщений: 23373
  • shit in - shit out
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #19 : Февраля 01, 2013, 15:41:29 »
deLuther,
отличная тема, давно пора было создать  :alc: :alc: :alc:

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #20 : Февраля 01, 2013, 16:20:06 »
А вот ещё для более ленивых на изменения (для Octave, жирный платный матлаб пусть идёт лесом ;D).
Качаем скриптец.
* ToneMatching_Octave_v2.txt (0.58 КБ - загружено 88 раз.)
[fname,fpath]=uigetfile("*.wav","Select Source");
[source,fs] = wavread(strcat(fpath,fname));
[fname,fpath]=uigetfile("*.wav","Select Target")
target = wavread(strcat(fpath,fname));
nfft = 2^nextpow2(fs);
w = kaiser(nfft,8);
target_spectrum = pwelch(target,w,0.5,nfft,fs,"twosided");
source_spectrum = pwelch(source,w,0.5,nfft,fs,"twosided");
matching_spectrum = sqrt(target_spectrum./source_spectrum);
imp = ifft(matching_spectrum);
[y,mpimp] = rceps(imp);
mpimp = mpimp/max(abs(mpimp));
[fname,fpath]=uiputfile("*.wav","Select Output")
wavwrite(mpimp,fs,32,strcat(fpath,fname));

Запускаем так:
[fname,fpath]=uigetfile("*.txt","Select Script");source(strcat(fpath,fname));Появится диалог в котором можно выбрать файл со скриптом, потом просто выбирать файлы в соответствии с заголовками появляющихся диалогов (маршруты удобно добавлять в Favorites).
« Последнее редактирование: Февраля 01, 2013, 16:23:12 от deLuther »

Оффлайн AlexPA

  • Частый посетитель
  • **
  • Сообщений: 100
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #21 : Февраля 01, 2013, 16:28:52 »
deLuther,  есть еще scilab (http://www.scilab.org/) не знаешь в нем можно такие же манипуляции делать?

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #22 : Февраля 01, 2013, 16:36:22 »
Зависит от того есть ли там аналог pwelch(), как самого геморного компонента для реализации самому (я знаю т.к. делал в математике такое). rceps() можно заменить, как я и показал в первом сообщении.
Я же не буду проверять каждый открытый проект на вшивость :)
Кому интересно пусть повторит это в другом пакете и выложит наработки сюда, если получится.
Octave был выбран из-за максимальной совместимости с матлабом, где я знал как надо сделать нужное.
Так-то вроде PSD-estimation (Power spectral density estimation) в Scilab`е есть, наверно и там можно тогда:
http://www.scilab.org/scilab/features/scilab/signal_processing
PSD это то же самое что и 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 КБ - загружено 111 раз.)
[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 за наводку.
« Последнее редактирование: Февраля 01, 2013, 20:13:55 от deLuther »

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #23 : Февраля 06, 2013, 18:14:36 »
Добавлю ещё одну фишку, может кому покажется полезной.
Назначение инструмента - приведение импульса к минимальной фазе, например когда получали пульсовым методом или криво, т.е. когда есть преэхо потому что обрезали вручную итп. Теоретически это может избавить от фазовых проблем когда пытаемся смешивать разные импульсы (из разных источников).

Утилита предназначена всё для того же SciLab.
* MP_transform.txt (0.64 КБ - загружено 87 раз.)

//Minimal phase transformation
//by deLuther Tech.
fnames=uigetfile(["*.wav","Wave files"],"","Select Sources",%t);
[rows,cols]=size(fnames);
if strcmp(fnames,"")==0 then cols=0; end
for i=1:cols
    [source,fs] = wavread(fnames(i));
    nfft = 2^nextpow2(fs);
    [nr,nc]=size(source);
    source=resize_matrix(source,nr,nfft);
    cepst=ifft(log(abs(fft(source))));
    cepst(2:nfft/2)=2*cepst(2:nfft/2);
    cepst(nfft/2+2:nfft)=0;
    mpimp=real(ifft(exp(fft(cepst))));
    mpimp=resize_matrix(mpimp,nr,nc);
    mpimp=mpimp/max(abs(mpimp));
    outname=strsubst(fnames(i),".wav","_mp.wav");
    wavwrite(mpimp,fs,32,outname);
end

Использование: запускаем через File->Execute...
Далее в диалоге Select Sources выбираем импульсы которым требуется преобразование, результат будет иметь название файла с добавлением _mp.
« Последнее редактирование: Февраля 06, 2013, 18:43:08 от deLuther »

Оффлайн Жах Лютий

  • Новичок
  • *
  • Сообщений: 68
  • GuitarPlayer.Ru fan!
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #24 : Февраля 15, 2013, 00:00:14 »
экспериментировал я с ограничением.. Как ни странно, оказалось жесткое ограничение( типа if(x>1)y=1;else if(x<-1)y=-1;else y=x; ) дает самый злой читаемый сочный звук. Остальное подгоняется пре и пост фильтрацией.
Всякие мифы про четность, мягкое ограничение, ступенчатое ограничение не подтвердились.. Что касается динамики, то ее гораздо проще реализовать тоже на прямую в цифре, чем мурыжится с эмуляцией перезаряда емкостей в ламовых каскадах
Вот сэмпл накидал на скорую руку с DI треков от Ola Englund
https://soundcloud.com/polissja/olag55

Если интересно - могу кинуть свой вст плагин и остальные прибамбасы...

deLuther, чем Ваше приведение к мф отличается от классического через hilberт transform http://en.wikipedia.org/wiki/Minimum_phase#Relationship_of_magnitude_response_to_phase_response ?
« Последнее редактирование: Февраля 15, 2013, 00:08:58 от Жах Лютий »

Оффлайн R-Type

  • Эксперт
  • *****
  • Сообщений: 2276
  • Storm Electronics
    • Storm Electronics - гитарные и басовые педали и датчики
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #25 : Февраля 15, 2013, 06:01:44 »
экспериментировал я с ограничением.. Как ни странно, оказалось жесткое ограничение( типа if(x>1)y=1;else if(x<-1)y=-1;else y=x; ) дает самый злой читаемый сочный звук. Остальное подгоняется пре и пост фильтрацией.
Всякие мифы про четность, мягкое ограничение, ступенчатое ограничение не подтвердились.. Что касается динамики, то ее гораздо
Вот сэмпл накидал на скорую руку с DI треков от Ola Englund

пипец, как меня придавило твоим семплом... утром на свежие уши и голову послушаю еще раз, справедливост ради. А сейчас - послушал 2 раза - на голове углы появились и глаза чуть не повылазили из орбит. расплющило в общем.  :crazy: :7:
мож, ну его в  баню эту "сочнось" и "читаемость" алгоритма "( типа if(x>1)y=1;else if(x<-1)y=-1;else y=x; )"  и, таки, убрать лишние гармоники и сделать перегруз более плавным (имитируя перезаряд емкостей) чтоб было помягче? что происходит при затухании сигнала (3:45) даже комментировать не хочу... мож, другие не дураки, все-таки, а?  :rolleyes:

Оффлайн deLuther Автор темы

  • Живу на форуме
  • *******
  • Сообщений: 33464
  • alderman of morning star
    • Malefice
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #26 : Февраля 15, 2013, 08:42:37 »
deLuther, чем Ваше приведение к мф отличается от классического через hilberт transform http://en.wikipedia.org/wiki/Minimum_phase#Relationship_of_magnitude_response_to_phase_response ?
Во-первых, это не моё :)
А, во-вторых, дана практическая реализация преобразования.
В качестве отправной точки выступал этот материал: http://www.dspguru.com/dsp/howtos/how-to-design-minimum-phase-fir-filters, хотя если делать гомоморфную фильтрацию как описано здесь, то будет неправильно. В конечном счёте сделано как в документации Matlab на функцию rcepst.

Оффлайн Жах Лютий

  • Новичок
  • *
  • Сообщений: 68
  • GuitarPlayer.Ru fan!
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #27 : Февраля 16, 2013, 04:41:53 »
Вот моя реализация для матлаба
function [ sm ] = mpestimate( s )
as=abs(s);

  % clip to avoid zeros ( log(0)=-Inf )
cutoff=-100; %db
thr=max(as)*10^(cutoff/20);
toosmall=as<thr;
as(toosmall)=thr;

  % estimate minimum phase
sm=as.*exp(1i*-imag(hilbert(log(as))) );

end

R-Type, Вам скорее мой вкус не нравится(пост-фильтр в смысле), я люблю верхнюю середину...
Вот на таком коде сделал и до кучи реамп через реальный ламповый пред, ручки ТБ примерно по центру, пост-фильтр в цифровом варианте примерно с такой же характеристикой, как в живой лампе.
clear all;

gain=1000;

% read
[X1,Fs,nb]=wavread('test1_all.wav');

% pre-filter
b=[-0.004567146,0.152626276,0.545511842,0.862337112,0.999999881,0.962121248,0.812350273,0.600780368,0.378364444,0.169229269,-0.005534053,-0.143907428,-0.242131710,-0.307841420,-0.343513131,-0.358525038,-0.355895638,-0.343453884,-0.322804570,-0.299551010,-0.273741126,-0.249141335,-0.224712133,-0.203005552,-0.182411194,-0.164787292,-0.148324847,-0.134528518,-0.121603847,-0.110889435,-0.100700498,-0.092297554,-0.084131718,-0.077417374,-0.070735455,-0.065261364,-0.059687257,-0.055148363,-0.050428748,-0.046620727,-0.042584419,-0.039367795,-0.035894990,-0.033169985,-0.030172110,-0.027863026,-0.025270820,-0.023317218,-0.021073937,-0.019425631,-0.017483354,-0.016097665,-0.014415860,-0.013256192,-0.011799455,-0.010834336,-0.009572387,-0.008774638,-0.007681251,-0.007027388,-0.006079793,-0.005549550,-0.004728079,-0.004304051,-0.003591657,-0.003258467,-0.002640367,-0.002385020,-0.001848340,-0.001659274,-0.001193047,-0.001060486,-0.000654697,-0.000570059,-0.000216484,-0.000172257,0.000136495,0.000146627,0.000416875,0.000398636,0.000635982,0.000594020,0.000803351,0.000741720,0.000927091,0.000849605,0.001014590,0.000924110,0.001071930,0.000971079,0.001104236,0.000995517,0.001116395,0.001001358,0.001111984,0.000992417];

x=filter(b,1,X1);

% upsample to eliminate aliasing
y=resample(x,4,1);
% distort
y=y*gain;
y(y>1)=1; y(y<-1)=-1; % distort
% dosnsample back
y=resample(y,1,4);

% post-filter
a=[1.000000000,-2.805763906,2.614648586,-0.808878569];
b=[0.344138134,-1.011234292,0.990995690,-0.323899533];
y=filter(b,a,y);

% save
y=y./max(abs(y))*0.99999;
wavwrite(y,Fs,nb,'gdistorted.wav');

https://soundcloud.com/polissja/ola55-2
https://soundcloud.com/polissja/ola55-1
« Последнее редактирование: Февраля 16, 2013, 04:46:25 от Жах Лютий »

Оффлайн R-Type

  • Эксперт
  • *****
  • Сообщений: 2276
  • Storm Electronics
    • Storm Electronics - гитарные и басовые педали и датчики
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #28 : Февраля 16, 2013, 15:32:48 »
Жах Лютий, в плане "плющенья" и чистоты перегруза мне тут гораздо больше нравится. эквализация - не думаю...

Оффлайн Жах Лютий

  • Новичок
  • *
  • Сообщений: 68
  • GuitarPlayer.Ru fan!
Re: DSP DIY (цифровая обработка своими руками)
« Ответ #29 : Февраля 16, 2013, 20:27:05 »
Ну так один из этих сэмплов отличается от первого только эквалайзером на выходе. Алгоритмы ограничения то одинаковые.
Ну и реальная лампа мало чем от простого цифрового ограничителя отличается, узнать где что сможет далеко не каждый и то только поиграв вживую :)