matlab进制转换
最近在做一个关于编码的算法,用到了进制转换关系。查了一下,matlab中好像没有对整个数组进行进制转换的可调函数,所以自己编写了一个。原理比较简单,也没有很奇怪的坑,这里就不详述啦。
主函数如下:
clear all;
clc;
M = 8;
number = 17;
bits = randi([0,1],1,number) %产生二进制比特流
% 2 -- M
[s0] = B2M(bits,M);
% M -- 2
final_bits = M2B(s0,M);
final_bits = final_bits(1:number); %去掉补充的零元素
error_num = length(find(final_bits~=bits))/number %误码率计算
两个调用函数分别如下:
function [s0] = B2M(bits,M)
% func: 2进制数组bits向M进制的转换,不丢失末尾信息
% bits: 2进制数组;
% M: 转换进制;
% s0: 转换后的M进制数据;
number = length(bits);
d = ceil(number/log2(M));
zero_num = d*log2(M) - number;
sy = [bits,zeros(1,zero_num)]; %补零:避免丢失信息
s0 = zeros(1,d);
for ii = 1:d
for jj = 1:log2(M)
s0(ii) = s0(ii) + sy(ii*log2(M)-(jj-1))*2^(jj-1);
end
end
end
function [final_bits] = M2B(s0,M)
% func: 多进制数组bits向2进制的转换
% s0: 多进制数组;
% M: 多进制;
% final_bits: 转换后的二进制数据;
for jj = 1:log2(M)
layer(jj) = 2^(log2(M)-jj);
end
final_bits = zeros(1,length(s0)*log2(M));
for ii = 1:length(s0)
for jj = 1:log2(M)
final_bits((ii-1)*log2(M)+jj) = floor(s0(ii)/layer(jj));
s0(ii) = s0(ii) - final_bits((ii-1)*log2(M)+jj)*layer(jj);
end
end
end