Muunna Matlab-koodi c-koodiksi Matlab Coderin perusteella

Convert Matlab Code C Code Based Matlab Coder



Äskettäin tekemässä signaalinkäsittelyyn liittyviä toimintoja, simuloi ensin Matlabissa, käytä sitten c / c + + saavuttaaksesi ja yritä sitten käyttää muunnosfunktiota Matlab Coderin avulla.
Viite:
Muunna matlab-koodi C-koodiksi MATLAB-kooderin perusteella
Virallisen verkkosivuston videon selitys
Matlab kutsuu c / c ++ -koodia
Kiitos paljon!

I. Käsite ja kehitysprosessi

MATLAB-kooderi voi luoda erillisen, luettavan ja kannettavan C / C ++ -koodin MATLAB-koodista.
Maallikon termeillä kirjoitetun Matlab-toimintomoduulin koodi muunnetaan c / c ++ -koodiksi, ja sitten parannamme tällä perusteella.
Tämän artikkelin kehitysympäristö: Win10 64, VS2015, Matlab R2016A.



Kehitysprosessi : 3 vaihetta C-koodin luomiseksi MATLAB-kooderin avulla:



  1. Kehitä MATLAB-koodi ja testitiedostot, jotka toteuttavat tietyt algoritmitoiminnot
  2. Tarkista MATLAB-koodin yhteensopivuus varmistaaksesi, että MATLAB-koodin lauseet voidaan muuntaa C-koodiksi (jotkut matlab-koodilausekkeet eivät voi luoda c / c + + -koodia, kuten imread, imshow, plot ja muut matlabin toiminnot)
  3. Luo c / c ++ -koodi MATLAB-kooderilla ja tarkista se VS2015: ssä.

Toiseksi, harjoittele testausta

Viiteartikkeli antaa ajatuksen erottaa toimintomoduulin koodi testikoodista, joten tämä artikkeli hyödyntää tätä ajatusta ja suorittaa käytännön testausta.
Toimintomoduulin a.m-tiedostoa voidaan tietysti kutsua b.m-tiedostoksi. Molemmat tulisi valita käännettäväksi kääntämisajankohtana (voidaan ymmärtää riippuvuutena), mutta tämä artikkeli ei sisällä tämän toiminnon toteuttamista.



2.1 Matlab-toimintomoduulin koodi ja sen testikoodi

myfft.m
Poistaa DC-komponentin syötetiedoista ja suorittaa FFT: n. Niistä% # codegen käytetään estämään varoitusvirheet

%#codegen function B = myfft(v1,N) v1=v1 - mean(v1) B = fft(v1,N)

test_main.m
luoda tietojoukkoja ja testata

f=100 %Signal frequency Hz Fs=1000 %Sampling frequency N=256 %Sampling points t=(0:N-1)/Fs %Sampling time s S=1000*sin(2*pi*f*t)+20*randn(size(t)) %Signal sample value %B = meanVal(S,N) B = myfft(S,N) f =((-N/2):(N/2-1))*Fs/N plot(abs(B)) title('Amplitude Spectrum of S') xlabel('f (Hz)') ylabel('|P1(f)|')

Matlab-lähtö:
kuva
f = (N-1) Fs / N = 26 1000/256 = 100 Hz。



2.2 MATLAB-kooderin käyttäminen c / c ++ -koodin luomiseen
  1. Kirjoita komentoikkunaan mex -setup, valitse olemassa oleva kääntäjä, kirjoittajan mukana tulee c-kääntäjä, lukija voi myös vaihtaa c ++ -kääntäjään (syöttö mex -setup C++)。
    kuva

  2. Kirjoita kooderi (graafinen käyttöliittymä) komentoikkunaan, paina Enter ja avaa MATLAB Coder Project -valintaikkuna (tai napsauta Matlab-ohjelmiston käyttöliittymää). MatLab Coder -Kuvake).
    (1) Valitse koottava toimintomoduuli myfft.m Valitse-moduulista.
    kuva
    (2) Napsauta Seuraava
    kuva
    Yllä olevan kuvan punainen ruutu voi myös jatkaa toimintomoduulin .m-tiedoston lisäämistä.
    (3) Napsauta Seuraava päästäksesi Määritä syötetyypit -käyttöliittymään. Syötä test_main.m-testitiedosto ja napsauta Autodefine Input Types-painiketta, jotta Matlab tunnistaa automaattisesti toimintomoduulitoimintojen käyttöliittymämuuttujien mitat ja tyypit.
    kuva
    (4) Napsauta Seuraava ja napsauta Tarkista ongelmat -painiketta.
    kuva
    (5) Napsauta Seuraava ja napsauta Luo-painiketta luodaksesi C / C ++ -koodin.
    kuva
    Onnistuneen luomisen jälkeen seuraava kuva voidaan tarkastella lib-tiedostossa.
    kuva

2.3 VS2015-tarkastus

Luo projekti myfftprj VS2015: n avulla lib-hakemiston libvs-kansioon ja tuo kaikki .c.h-tiedostot projektiin.
Fyysisen polun vuoksi muokkaa nykyisen projektin otsikkotiedoston polkua.
kuva
Huomasimme, että projektin tuloilmentimen syöte on tyhjä, joten sitä on muutettava test_main.m-tiedoston mukaan.

/* * Arguments : double result[256] * Return Type : void */ static void argInit_1x256_real_T(double result[256]) { int idx1 const double pi = 3.141592653589793 const double Fs = 1000 //Sampling frequency /* Loop over the array to initialize each element. */ for (idx1 = 0 idx1 < 256 idx1++) { /* Set the value of the array element. Change this value to the value that the application requires. */ double t = idx1 / Fs result[idx1] = 100 * sin(2 * pi * 100 * t)//argInit_real_T() } }

Samanaikaisesti myös tuloparametri N on korjattava ja lisättävä oikein ja tulostustoiminnot, kuten getchar ().
On huomattava, että luotu c ++ -koodin lähtömuuttuja on rakennetyyppinen muuttuja, joka määritetään todellisen lähdön mukaan. Meidän on korjattava ja tulostettava rakenteen ymmärtämisen perusteella.
Esimerkiksi, kun syötetään kompleksiluku, tyyppi on emxArray_creal_T Kun todellinen numero annetaan, tyyppi on emxArray_real_T
koodi:

/* Include Files */ #include '../rt_nonfinite.h' #include '../myfft.h' #include 'main.h' #include '../myfft_terminate.h' #include '../myfft_emxAPI.h' #include '../myfft_initialize.h' #include /* Function Definitions */ void printArr(emxArray_creal_T *arr, int size) { for (int i = 0 i < size i++) { printf('%4d %8.4f %8.4f ', i, (arr->data[i]).re, (arr->data[i]).im) //printf('%4d %8.4f ', i, arr->data[i]) } } /* Function Declarations */ static void argInit_1x256_real_T(double result[256]) static double argInit_real_T(void) static void main_myfft(void) /* Function Definitions */ /* * Arguments : double result[256] * Return Type : void */ static void argInit_1x256_real_T(double result[256]) { int idx1 const double pi = 3.141592653589793 const double Fs = 1000 //Sampling frequency /* Loop over the array to initialize each element. */ for (idx1 = 0 idx1 < 256 idx1++) { /* Set the value of the array element. Change this value to the value that the application requires. */ double t = idx1 / Fs result[idx1] = 100 * sin(2 * pi * 100 * t)//argInit_real_T() } } /* * Arguments : void * Return Type : double */ static double argInit_real_T(void) { return 0.0 } /* * Arguments : void * Return Type : void */ static void main_myfft(void) { emxArray_creal_T *B double dv0[256] emxInitArray_creal_T(&B, 2) /* Initialize function 'myfft' input arguments. */ /* Initialize function input argument 'v1'. */ /* Call the entry-point 'myfft'. */ argInit_1x256_real_T(dv0) myfft(dv0,256 , B) //argInit_real_T() printArr(B, 256) emxDestroyArray_creal_T(B) } /* * Arguments : int argc * const char * const argv[] * Return Type : int */ int main(int argc, const char * const argv[]) { (void)argc (void)argv /* Initialize the application. You do not need to do this more than one time. */ myfft_initialize() /* Invoke the entry-point functions. You can call entry-point functions multiple times. */ main_myfft() /* Terminate the application. You do not need to do this more than one time. */ myfft_terminate() getchar() return 0 }

Tuotos:
kuva

Kolmanneksi Matlab-vinkkejä

  • Ei näy tieteellisessä merkinnässä (viite artikla
format short g #include 'mex.h' / / Use the header file that MEX must contain void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ mexPrintf('hello world ') } mex hello.c hello %Script run