[b,f,t]=specgram(data,nfft,Fs,window,numoverlap);
imagesc(t,f,20*log10(abs(b))), axis xy, colormap(jet); % 畫時頻圖
其中:
% nfft是fft的長度,越長的話,頻域分辨率越高,但是,對於語音這種時變信號,不能過長,一般采樣率16k或者8k的取1024或者512,要看采樣率的高低。
% fs就是采樣率,不多說了。
% window是指窗的長度,一般和nfft相同即可。
% numoverlap是指nfft減去步長,越大越好,但運算量越大。一般取nfft的3/4效果就比較好了。
% 舉例:
% b= specgram(a,512,8000,512,384);
% b是一個矩陣,復數的,畫圖的時候需要取絕對值!
C#與MATLAB之間傳遞參數
MWNumericArray是MWArray和c#中數據的中間類,怎么用?怎樣在C參數?
a.double型、int型等數值類型的變量傳遞
MWNumericArray i = null, result = mydouble;
i=4;
myClass myclass = new myClass(); //實例化
result = (MWNumericArray)myclass.myfunc(i);
b.字符串(需要用到MWCharArray和MWArray轉換)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)
c.多個輸出參數組成的數組
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取的數組(matlab返回的數組下界是從1開始的)
取出數組中的一個元素值
mydouble=out_Arr[i].ToScalarDouble();
如上面例子ToScalarDouble一類的toXXXX等方法還有許多。
d.result.toArray可以把matlab返回的矩陣變成C#的n x m數組,eg:
double[,] csArray= (double[,])result.ToArray(MWArrayComponent
e.將數組傳入Matlab(和傳遞單個數值的方法一樣)
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };
MWNumericArray x=dbx;
myclass.picture(x);
M文件如何接收和返回?
function x=test(h,d) //接收兩個參數,返回一個
function [x1,x2]=test(h,d) //返回數組
以上為.Net方式連接,以下為COM方式連接(編譯速度而言.net的方式要快上很多,而且似乎比較穩定)
matlab編譯工作
- mbuild -setup
- deploytool,Matlab Builder for .net,Generic COM Component
- 添加m函數文件(eg: myfunc.m),改類名(eg: myComClass),build
注冊dll
regsvr32 myCom.dll
regsvr32 mwcomutil.dll
VS2005調用: - Reference加Com控件
- 調用示例
double[,] arr = null;
object in_a, out_a;
in_a = 500;
out_a = arr1;
myCom.myComClass mc = new myCom.myComClass();
mc.myfunc(1, ref out_a, in_a);
小例子:(提取matlab返回的兩個參數並轉化為C#的矩陣)
Code
testz.testzclass st = new testz.testzclass();
MWArray[] max = st.testz(2);
MWNumericArray x1 = (MWNumericArray)max[0];
MWNumericArray x2 = (MWNumericArray)max[1];
double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real);
double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real);
label1.Text = location1[1,2].ToString();
其中的M文件:
Code
function [x1,x2]=testz()
x1=[1 2 3;
4 5 6;
7 8 9;];
x2=[9 8 7;
6 5 4;
3 2 1;];
另一篇:
以下是本人編程中總結的一些思路,拿出來與大家共享。不對之處,請留言說明。
版本:Matlab R2007b ,Visual Studio 2005
C++/C#數據類型到M類型
此方向轉換十分簡單。
如果C++/C#數據不是數組,
• 直接將值傳遞給已經初始化的MWArray數組中的成員
• 直接將數據類型賦值給已經初始化的MWNumericArray變量。
• 直接將字符串類賦值給已經初始化的MWCharArray變量。
如果是數組類型:
• 直接賦值給MWNumericArray變量;
• 賦值給MWArray變量,則在前面加上類型轉換如:(MWNumericArray)進行強制轉換。
總之,MWArray是總類型,其它的以MW開頭,以Array結尾的變量類型都可以直接對它進行賦值或取值。
M類型到C++/C#數據類型
MWArray
M類型,它是M文件的編譯后內部的標准類型,一切C++/C#類型都要最終轉換成此類型,方可作為參數調用M語言函數。
MWCharArray
M的字符串類型,使用它可以將M中的字符類型轉換成C++/C#的字符串類型。
MWNumericArray
MWNumericArray是MWArray與C#等語言的轉換中間類型。
常用的轉換函數:
① public Array ToArray(MWArrayComponent component);
將M類型轉換成C#的Array類型,然后可以直接轉換成其它類型的數組。
② public byte ToScalarByte();
將M類型轉換成C#的字節類型;
③ public double ToScalarDouble();
將M類型轉換成C#的雙精度類型;
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
④ public float ToScalarFloat();
將M類型轉換成C#的單精度類型;
⑤ public int ToScalarInteger();
將M類型轉換成C#的整型類型;
⑥ public long ToScalarLong();
將M類型轉換成C#的長整C/C++/C#數據型類型;
⑦ public short ToScalarShort();
將M類型轉換成C#的短整型類型;
⑧ public override string ToString();
將M類型轉換成C#的字符串類型;string arror = mwArgout[2].ToString();
⑨ public Array ToVector(MWArrayComponent component);
將M類型轉換成C#的Array類型,然后可以直接轉換成其它類型的數組。
下面使用調試過的代碼示例表述①⑨兩個函數的區別:
①
double[,] Temp1 = new double[1,3];
Temp1=
(double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);
⑨
double[] s1 = new double[2];
s1 =
(double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);
從以上代碼可以看出:函數①得到了二維數組,而⑨則是得到了一維數組。轉換成C++/C#數據類型后,它們的維數均為從0開始。