Как отмечалось в первой части (part1), в пакет Scilab входит Хcos — графический редактор для визуального моделирования гибридных динамических систем, аналогичный Simulink (Matlab). При использовании Хcos, разработчик создает на экране дисплея модель устройства из стандартных библиотечных блоков и проводит необходимые расчеты. Преимущество такого типа моделирования заключается в том, что разработчику достаточно начальных знаний языка программирования и численных методов, а также знаний предметной области, в которой он работает. Важно также отметить, что при использовании Xcos, создание моделей основывается на использовании технологии Drag-and-Drop. «Кирпичиками» при построении модели служат визуальные блоки, которые хранятся в библиотеке Xcos.
Воспользуемся возможностями Xcos для создания источников звуковых сигналов и шума. Рассмотрим, вначале, как получить синусоидальный звуковой сигнал. Прежде всего, создадим модель нашего генератора. В инструментах, в командном окне Scilab выберем пункт: Визуальное моделирование Xcos. В результате появится 2 дополнительных окна: палитра блоков и Xcos (рис.1)
Рис.1
Используя блоки из палитры, перетащим мышью нужные блоки в окно Xcos (рис.2).
Рис.2
Мы использовали блоки GENSIN_f (генератор синусоиды), CLOCK_c (счётчик времени), CSCOPE (осциллограф). Если кликнуть мышью на каждый блок в нашей схеме, то можно менять параметры, например для блока GENSIN_f можно менять амплитуду, частоту и фазу (рис.3).
Рис.3
В пункте "Моделировать" выберем пункт "Запустить", в результате появится ещё одно окно с графиком нашего сигнала (рис.4).
Рис.4
Настроим параметры таким образом, чтобы получить нужные нам звуковые сигналы.
В пункте "Моделирование" выберем пункт "Установить контекст" и в появившемся окне введём наши данные, согласно синтаксису Scilab (рис.5,6).
Рис.5
Рис.6
В нашу модель мы добавили блок усиления с коэффициентом усиления 1. Этот коэффициент можно менять как в большую, так и в меньшую сторону. Полученные данные запишем в рабочую среду Scilab, а затем через него можно записать в файл формата .wav или воспроизвести. К сожалению, напрямую в Xcos можно записывать звуковые файлы только в формате .au (http://www.online-convert.com/ru/file-format/au).
Изменим нашу модель следующим образом (рис.7):
Рис.7
добавив вывод данных в рабочее пространство Scilab в виде переменной А.
Стоит заметить, что тип этой переменной struct (структура) и имеет 2 поля : A = values: [88200x1 constant], time: [88200x1 constant]. Воспроизвести нашу синусоиду можно командой sound(A.values).
Записать в файл:
f=440;bits=16;Fs=44100;
xx=pwd();//текущая директория
sinfile = xx+'\sin'+string(f)+'.wav';
wavwrite(A.values, Fs, bits, sinfile);
Аналогично, через рабочее пространство Scilab можно передать данные из внешних файлов в Xcos.
Для сигналов других видов уже есть стандартные блоки, которые находятся в палитре в пункте: Источники сигналов и воздействий. Это пилообразный- SAWTOOTH_f, прямоугольный-GENSQR_f, импульсный- PULSE_SC, ступенька- STEP_FUNCTION и генератор случайных сигналов-RAND_m, который может выдавать как равномерно распределённые, так и нормально распределённые сигналы. Последний генератор можно использовать для создания "белого" и "белого гауссова" шума.
Остаётся вопрос, каким образом можно создать модель генератора "розового" шума? "Розовый" шум со спадом -10 dB/декаду и постоянной мощностью на октаву может быть получен фильтрацией "белого" шума. Фильтр с отклонением 0,3 дБ в диапазоне от 0.00045 Fs до 0.45 Fs (частота семплирования) был предложен Robert Bristow-Johnson (http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt). Этот фильтр преобразует "белый" шум, равномерно распределённый от -1 до 1, в неоднородно распределённый "розовый" шум с RMS амплитуды 1.
Рис.8 Передаточная функция фильтра
Создадим модель (рис.9), используя блоки RAND_m (генератор случайных сигналов), GAINBLK_f (усиление), SUMMATION (суммирование), CONST_m (генератор постоянной величины),DLR (дискретная передаточная функция),CLOCK_c (блок, задающий частоту дискретизации), CMSCOPE(многооконный осциллограф). Параметры А и В для блока RAND_m зададим равными -1 и 2 соответственно, для того, чтобы амплитуда сигнала менялась в диапазоне [-1,1].
Рис.9
Вывод данных в рабочее пространство Scilab в виде переменной осуществляется аналогично рис.7.