% data Y. The filter is a \ % implementation of the standard difference equation: % % a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) % - a(2)*y(n-1) - ... - a(na+1)*y(n-na) % % If a(1) is not equal to 1, FILTER normalizes the filter % coefficients by a(1). % 设定成单片机上用的那种,Q B = [Q] A = [1 -(1-Q)] Y = FILTER(B,A,X)% 这样就和我自己写的那个f_filter1order(X,Q)一样了。测试过。 B = [1 1 1 1] A = [sum(B) ] 就是把最近的4个进行平均。
17.3 重采样
% INTERP Resample data at a higher rate using lowpass interpolation. % Y = INTERP(X,R) resamples the sequence in vector X at R times % the original sample rate. The resulting resampled vector Y is % R times longer, LENGTH(Y) = R*LENGTH(X). k0 = [0 2 3 4]; interp(k0,R); % 这个R只能为整数,所以只能添加点,不能删除点。 18 与单片机程序转换时常用指令
18.1 把C语言函数转换成m函数
1、 把相关内容放到一个m文件中,建立函数,包括宏定义; 2、 把’//’替换成’%’; 3、 把’#define’替换为’’;
4、 把宏定义做成变量赋值,都转换成10进制;0x12在 m文件中写成hex2dec('20');
5、 把全局变量在m文件中定义类似的global;C中是数组,m文件中也定义成数组,赋初值; 6、 m文件的子函数中声明全局变量; 7、 数组下标‘[’和‘]’改成‘(’和‘+1)’ 8、 位操作:把‘&’,‘|’,‘>>’,‘<<’,‘’等替换格式;如c=A&B?c = bitand(uint8( A ),B); 9、 ‘if’操作中,‘else if’替换为‘elseif’,并对每个if添加end; 10、 Switch操作:每个case结尾的break’删掉;
36
11、 12、 13、 14、 Bitand Bitor Bitxor Bitcmp ‘{’,‘}’,‘:’全部替换为空; ‘+=’,‘-=’,‘*=’,‘/=’,‘++’,‘--’替换格式; Smart Indent; 测试;
单片机中指令 & | ^ ~ <<, >> && || == != (u8) 按位与 按位或 按位异或 按位取反 N大于0,左移 逻辑与 逻辑或 逻辑等于 逻辑不等于 含义 Matlab中指令 Bitshift(a,N) & | == ~= uint8(这个负数都处理为0了) rem(x,y) mod(x,y)
两者的区别是余数的符号,rem与x相同,而mod与y相同 %商
s=floor(13/3) %余数
y=rem(13,3)
【有符号的十六进制数转换成十进制数】
function decval=hex2decWithSign(hexval, length)
decval = hex2dec(hexval); sign = bitget(decval, 4*length); negative_numbers = (sign == 1);
decval(negative_numbers) = decval(negative_numbers) - bitshift(1, 4*length);
用法:
>> hex2decWithSign({'FFFF', '0000'}, 4)
ans =
-1 0
>> hex2decWithSign('FFFF', 5)
37
【matlab】
___Data Type_______ Range of Values_______ Conversion Function Signed 8-bit integer____ -2e7 to 2e7-1_____________int8 Signed 16-bit integer__ -2e15 to 2e15-1____________int16 Signed 32-bit integer__ -2e31 to 2e31-1____________int32 Signed 64-bit integer___-2e63 to 2e63-1____________int64 Unsigned 8-bit integer______0 to 2e8-1____________uint8 Unsigned 16-bit integer_____0 to 2e16-1___________uint16 Unsigned 32-bit integer_____0 to 2e32-1___________uint32 Unsigned 64-bit integer_____0 to 2e64-1___________uint64
18.1.1 matlab读16进制文件-大小端
matlab的大小端:big endian / little endian
matlab在读取十六进制文件时,也会有大小端的问题。 例如要读取十六进制数据文件:01 CB 07 4D
[filename, pathname, filterindex] = uigetfile( ... {'*.txt','TXT (*.txt)'; ...
'*.dat','DAT-files (*.dat)'; ... '*.*', 'All Files (*.*)'}, ... 'Pick a file', 'Untitled.dat');
fid=fopen([pathname filename],'rb', 'b'); % ‘b’--big endian if (fid < 0)
display(sprintf('Could not open %s\\n', filename)); return; end
data = fread(fid,inf, 'bit16'); fclose(fid);
读出来的结果是: data(0) = 0x01CB data(1) = 0x074D
38
而如果用小端模式(little-endian),读出来的结果会是: data(0) = 0xCB01 data(1) = 0x4D07
fopen的默认模式是little-endian。
19 基本逻辑表达
Switch 19.1 半透明色块
可用指令pcolor(x,y,c)来画色块,然后用alpha(a)来设置透明度,a为0-1的值。 常用的是画个四边形,此时x,y,c均为2*2的矩阵,x表示四个顶点的x值,y表示四个顶点的y值,对应关系为: X=[x1 x2;x3 x4]; Y=[y1 y2;y3 y4]; 四个顶点为(x1,y1), (x2,y2), (x3,y3), (x4,y4) 可以认为分别对应四边形的右上角,右下角,左上角,左下角。 C表示颜色,几种常用的颜色为: C=[0.4 0.2;0.7 0.8] %浅蓝 C=[1 1;1 1] %浅绿 C=[0.2 -1;1 -1] %黄 C=[1/3 2/3;-3 5/6] %红 C=[1/3 2/3;5/12 5/6] %深蓝 C=[1/3 2/3;-7 5/6] %深红 C=[2/3 1/3;5/6 5/12] %橙黄 C=[5/6 5/12; 1 0.5] %橘红 自己尝试的几种颜色,非标准写法。 % 程序示例 figure(4) X=[-0.7217 -0.8333;-0.8660 -1.0000]; Y=[0.4167 0.0000;0.5000 0.1000]; C=[0.4 0.2;0.7 0.8]; pcolor(X,Y,C) grid alpha(0.5) 39
19.2 Spapi, B样条插值, 2011-3-26发现居然x值不能反复,而且超出边
界之后归0了.
Spapi:B样条插值 sp = spapi({3,4},{x,y},z); {3,4}是代表x的阶次和y的阶次 fnval() spapi(k,x,y); % 这个是k阶B样条插值 K是阶次,5表示5阶4次。4次样条曲线,如果车的轨迹是这条曲线的话,对应加速度连续。 X需要单调。
Spline:三次样条插值,YY=spline(x0,y0,XX)计算等价于sp_temp=spapi(4,x0,y0); Spline(x0,y0,XX). 如果x0在同一x值处有两个y值,则从这两个点中间走过,并不过实际的点。 Csapi:三次样条插值,基函数是三次多项式 S=csapi(x,y) 其中x=[x1,x2,?.,xn], y=[y1,y2,?,yn]为样本点。 S返回样条函数对象的插值结果,包括子区间点、各区间点三次多项式系数等。 - 可用 fnplt()绘制出插值结果,其调用格式: fnplt(S) - 对给定的向量xp, 可用fnval()函数计算, 其调用格式: yp=fnval(S,xp) 其中得出的yp是xp上各点的插值结果。
Spaps:三次B样条拟合
Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能; 一. 样条函数的建立
第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类: cs* 三次样条
pp* 分段多项式样条,系数为t^n的系数 sp* B样条, 系数为基函数B_n^i(t)的系数
rp* 有理B样条Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能; 一. 样条函数的建立
第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类: cs* 三次样条
pp* 分段多项式样条,系数为t^n的系数
40