Содержание
Подключение к Matlab
Этот пример скрипта проектирует FIR-фильтр с помощью Matlab, используя следующую функцию Matlab:
h = firpm(N, a*2, b);
N: порядок фильтра
Пример фильтра нижних частот длиной 31:
H = firpm(30, [0 .1 .2 .5]*2, [1 1 0 0]);
Введите help firpm в командной строке Matlab для получения дополнительной информации об этой функции.
Этот скрипт может принимать Схему (Schematic) в качестве входного аргумента вместе с адресом FIR и порядком FIR (FirOrder). Если аргументы допустимы, скрипт запустит фильтр на целевом устройстве SHARC через SigmaStudio. Предполагается, что целевое устройство загружено с соответствующим скриптом.
Требования к аппаратному и программному обеспечению
Вся инфраструктура, необходимая для запуска SigmaStudio.
Установка Matlab с действующей лицензией.
Использование
matlabConnectionTest.exe schematic_name.dspproj fir Address firOrder
matlabConnectionTest.exe fir1.dspproj 10 30
Часто задаваемые вопросы
В: Как получить адрес FIR?
Вы можете получить его из окна захвата (Capture Window) или использовать экспорт для получения адреса.
В: Как собрать приложение?
Используйте код, приведенный ниже, для сборки приложения.
- myexample.cs
// #LANGUAGE# C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using Analog.SigmaStudioServer; namespace ConsoleApplication1 { class Program { class mYSsMatlab { public SigmaStudioServer sserver; public MLApp.MLApp matlab; public void Message(string s) { Console.WriteLine(s); } public bool runFir(string schematicName, int AddrFirCoef, float[] coef, int N) { int delayms = 10000; bool ret = sserver.SET_LOGGING_MODE(true); try { ret = sserver.SET_LOGGING_MODE(true); if (ret != true) { Message("Couldn't connect to SigmaStudio, please make sure that the SigmaStudio is running"); return ret; } } catch (Exception ex) { Console.WriteLine("Server Connection failed. exception {0}", ex.Message); Message("Couldn't connect to SigmaStudio, please make sure that the SigmaStudio is running"); return ret; } sserver.CLOSE_PROJECT(); ret = sserver.OPEN_PROJECT(schematicName); if (ret == false) { Message("schematic load failed " + schematicName); return ret; } ret = sserver.DELAY_SCRIPT(delayms); sserver.DOWNLOAD(); if (ret == false) { Message("schematic load failed " + schematicName); return ret; } sserver.PARAMETER_WRITE_ARRAY_FLOAT("IC 1", AddrFirCoef, N, coef); sserver.DELAY_SCRIPT(delayms); Message("Test case for : " + "matlabTest"); return ret; } public float[] designFir(int N) { float[] h = new float[N+1]; System.Array h_r = new double[N+1]; System.Array h_i = new double[N+1]; string returnString; int i = 0; /* Пример lowpass фильтра длины 31: h=firpm(30,[0 .1 .2 .5]*2,[1 1 0 0]); */ System.Array a = new double[4]; a.SetValue(0, 0); a.SetValue(0.1, 1); a.SetValue(0.2, 2); a.SetValue(0.5, 3); System.Array b = new double[4]; b.SetValue(1, 0); b.SetValue(1, 1); b.SetValue(0, 2); b.SetValue(0, 3); System.Array z = new double[4]; z.SetValue(0, 0); z.SetValue(0, 1); z.SetValue(0, 2); z.SetValue(0, 3); matlab.PutFullMatrix("a", "base", a, z); matlab.PutFullMatrix("b", "base", b, z); StringBuilder matlabCmdFir = new StringBuilder(); matlabCmdFir.AppendFormat("h = firpm({0}, a*2, b)", N); returnString = matlab.Execute(matlabCmdFir.ToString()); /* returnString = matlab.Execute("h = firpm(30, a*2, b)"); */ matlab.GetFullMatrix("h", "base", ref h_r, ref h_i); foreach(double c in h_r)h[i++] = (float)Convert.ToDecimal(c); return h; } public mYSsMatlab() { matlab = new MLApp.MLApp(); sserver = new SigmaStudioServer(); } } class Class1 { [STAThread] static void Main(string[] args) { int i = 0; int orderFir = 30; int addressFir = 30; if(args.Length != 3) { Console.WriteLine(" ERROR in arguments. Usage testMatlab schematic.dspproj firOrder"); return ; } try { addressFir = Int32.Parse(args[1]); } catch { Console.WriteLine("ERROR : wrong fir Address {0} Exiting ", args[1]); return; } try { orderFir = Int32.Parse(args[2]); } catch { Console.WriteLine("ERROR : wrong filter order {0}", args[1]); orderFir = 30; } Console.WriteLine("Testing FIR coef design with matlab and running with SigmaStudio, schematic used = {0} firAddress = {1} fir Order = {2} please wait...", args[0], orderFir, addressFir); mYSsMatlab ssMatLabTest = new mYSsMatlab(); /* проектирование FIR с помощью matlab */ float[] h = ssMatLabTest.designFir(orderFir); /* вывод FIR коэффициентов */ Console.Write("coef [{0}]= ", h.Length); foreach (double c in h) { Console.Write(" {0}", c); i++; } Console.WriteLine("] "); /* запуск FIR на sharc через SigmaStudio */ ssMatLabTest.runFir(args[0], addressFir, h, 30); } } } }