【问题标题】:How can I convert binary bits into index in MATLAB如何在MATLAB中将二进制位转换为索引
【发布时间】:2019-05-11 23:53:38
【问题描述】:

我有一个关于如何在 MATLAB 中使用二进制位作为索引的问题,例如,如果我使用 4 根天线来传输数据,那么在每个瞬间,一两根天线都处于活动状态来传输数据。如何使用天线的索引来传输该符号,这里是一个示例,如下所示:

%Suppose I'm using for antennas to transmit that data. 
Nt = 4;          % Number of antennas
Symbole = 1+j;    % The symbol to transmit in binary after modulation

Ant_index = 11;  % The antenna index which will be used to transmit data. (here number 3 will be used)
x_trans =zeros(Nt,1); % Initialization of antennas 
x_trans(Ant_index) = Symbole;     %Use the antenna to transmit the data 

我的问题是在最后一步,x_trans(Ant_index) = Symbole;我想使用二进制位作为索引,这意味着,而不是位 Ant_index = 11 表示十进制 3,我想使用这两个位作为天线传输相同的符号。例如,如果我有位 0101 ,这意味着我将使用天线编号 1 和编号 3 来传输上述相同示例Ant_index = 0011 中的符号。这意味着将使用第一根和第二根天线来传输符号。

编辑:

问题的第二部分,如果生成的天线索引位是随机生成的,那会怎样。我们希望避免使用Ant_index = 000;也就是说,我们需要Ant_index为十进制值,然后对十进制为0的000进行映射,天线1应该被激活,001 = 1--->天线2应该被激活。 010 = 2 ---> 天线 3 激活,011 = 3 ---> 天线 4 激活。 100 = 4 ---> 天线 1 和 2 处于活动状态,101 = 5 ---> 天线 1 和 3 处于活动状态,依此类推。

【问题讨论】:

  • 随机生成的Ant_index的范围是多少?
  • 范围是000到111,我的天线是4个
  • 这仅给您 7 个可能的值,不足以涵盖所有情况。如果您可以同时激活 2 根天线(共 4 根)的任意组合,则至少需要 10 个值(如果您还允许“无天线激活”的情况,则需要 11 个值)。
  • 你好我的朋友,我想我明白了,,它已经完成了..但我得到了奇怪的痕迹。我认为计算欧几里得距离的问题。我在这里发布了另一个详细的问题,stackoverflow.com/questions/53743618/… .. 如果您有任何想法,我将不胜感激。
  • 我想我会有足够的价值,例如,如果我有值 7,即 111 .. 以便传输的天线是 2 和 3。例如。 0 --> 天线 1 激活。 1 --> 天线 2 激活。 2 --> 天线 3 激活。 3 --> 天线 4 有源,4--> 天线 1 和 2 有源,5 --> 天线 1 和 3 有源,6 --> 天线 1 和 4 有源,最后 7 --> 天线 2 和 3 有源跨度>

标签: matlab dynamic-programming


【解决方案1】:

根据您所需的输入格式,您可以使用 2 个十进制到二进制转换函数之一:

  • de2bi => 返回 01 的数组,表示二进制数。
  • dec2bin => 返回二进制数的字符串表示形式。

转化率

我推荐使用de2bi,因为数组更容易转换为索引。例如: 激活天线 1 和 2(3 十进制 == 11 二进制):

>> de2bi(3) % index antenna 1 and 2 (`3` decimal == `11` in binary):
ans =
     1     1
>> de2bi(10) % index antenna 2 and 4 (`10` decimal == `1010` in binary):
ans =
     0     1     0     1

请注意,默认情况下de2bismall endian 位顺序返回二进制表示(数组中的第一个元素表示最低位)。这有点与我们的视觉约定相反,有一个参数可以反转它,但出于您的目的,它已经正是我们想要的。它使我们免于从右到左读取数组或反转它。


索引: 你说你有 4 个天线,但对于这个例子,我会放大一点。假设您需要控制 7 个天线。这意味着我总是必须有一个包含 7 个元素的索引数组。没问题,de2bi 允许您指定输出位数。因此,再次激活天线 2 和 4(共 7 个):

>> Nt=7;
>> Ant_index = de2bi(10,Nt)
Ant_index =
     0     1     0     1     0     0     0

这样您就可以直接使用索引来传输数据:

x_trans(Ant_index) = Symbole;

输入格式:

如果您知道基本二进制表和天线数量,这一切都很好。如果您希望能够使用二进制表示而不是直接十进制数来指定有源天线,您可以使用反向转换功能,更具体地说是bin2dec 最后一个示例向您展示它们如何协同工作:

>> stringAntIndex = '1010'
stringAntIndex =
1010

decimalAntIndex = bin2dec(stringAntIndex)
decimalAntIndex =
    10

>> Ant_index = de2bi(decimalAntIndex,7)
Ant_index =
     0     1     0     1     0     0     0

你当然可以简化为:

>> stringAntIndex = '1010' ;
>> Ant_index = de2bi(bin2dec(stringAntIndex),Nt)
Ant_index =
     0     1     0     1     0     0     0

编辑:好的,我将您更新的问题的答案放在这里以完成它,但请注意,您编辑的问题与原始问题完全不同。您现在所问的与将位转换为索引无关,它只是您必须事先定义的直接映射(因为它不遵循任何计算逻辑)。 基本上,将您的有源天线索引存储在一个单元阵列中,然后选择与您的随机生成的索引相对应的单元(您必须添加 1,因为 MATLAB 从1 开始阵列索引,而不是像许多其他语言一样在0 . 所以:

% Map the antenna to be active depending on decimal input
Antenna2Activate = {
    [1] ;   % antenna 1 active
    [2] ;   % antenna 2 active
    [3] ;   % ...
    [4] ;   % ...
    [1 2] ; % antenna 1 & 2 active
    [1 3] ; % antenna 1 & 3 active
    [1 4] ; % ...
    [2 3]   % antenna 2 & 3 active
    };

% Then to activate the proper antenna given a decimal input [decimalInput]:
Ant_index = Antenna2Activate{ decimalInput+1 } ;
x_trans(Ant_index) = Symbole;

为确保它按照您想要的方式运行,您可以运行以下代码:

decinput = 0:7 ;
for k=1:numel(Antenna2Activate)
    Ant_index = Antenna2Activate{ decinput(k)+1 } ;
    fprintf('Decimal input= %d \t Binary= %3s \t Ant_index: ',decinput(k),dec2bin(decinput(k),3))
    disp(Ant_index)
end

产量:

Decimal input= 0     Binary= 000     Ant_index:      1
Decimal input= 1     Binary= 001     Ant_index:      2
Decimal input= 2     Binary= 010     Ant_index:      3
Decimal input= 3     Binary= 011     Ant_index:      4
Decimal input= 4     Binary= 100     Ant_index:      1     2
Decimal input= 5     Binary= 101     Ant_index:      1     3
Decimal input= 6     Binary= 110     Ant_index:      1     4
Decimal input= 7     Binary= 111     Ant_index:      2     3

【讨论】:

  • 非常感谢您的详细解释。不幸的是,我不能为你的答案投票:(,因为我还是这个社区组的新手。。但我需要澄清一下,我有 Ant_index 是随机生成的,那么如果它是 0 0 0 怎么办0 0 0 0 ? 为此我问我们是否可以将其设为十进制,这意味着它是否是十进制 0,这意味着它是二进制(0 0 0 0 0 0 0),所以天线 1 将被激活,如果它是 1
  • @New_student。无论Ant_index 是随机生成的,函数de2bi 都会将十进制数转换为反向位数组,这或多或少是您问题的标题。我不明白,为什么十进制值 8(二进制为0001000)会激活天线 1 和 2。我的印象是它应该激活天线 4。
  • 很抱歉造成这种误解,我的意思是假设如果我们有生成的比特0 (0000000),这是否意味着我们没有任何激活的天线?所以为了避免这种情况,我的意思是,它将如下所示:0 --> 天线 1、1 --> 天线 2、3 --> 天线 4、4 --> 天线 5、5 --> 天线 6, 6 --> 天线 7、7 --> 天线 1 和 2、8 --> 天线 1 和 3,依此类推。
  • 伙计,你完全改变了你原来的问题。请通过添加最新评论中的信息来修改您的原始问题。我将在今天晚些时候更新我的答案,以考虑到新的要求。
  • 另外,我不知道您系统的详细信息,但系统处于“非活动”状态是很常见的。所以是的,如果您发送0,在当前版本中,没有天线将处于活动状态。所以它就像一个方便的“关闭”开关......你会如何关闭天线?另外,Ant_index 是如何随机生成的?你控制了这一代人吗?如果是,您可以阻止生成器输出值0... 比必须抵消所有结果更容易...
【解决方案2】:

您执行 ant_index = [0,0,1,1] 以在天线 1 和 2 上传输符号。然后执行 x_trans(ant_index == 1) = symbol。希望对您有所帮助。

【讨论】:

  • 非常感谢,这当然有帮助。但它不是 ant_index = [0,0,1,1],ant_index = 0011,它是随机位,没关系,它也适用于此。 .如果 ant_index 是十进制怎么办,我也可以这样做吗?例如,如果 1 个第一天线处于活动状态,如果 6,则 110 第二和第三个天线处于活动状态,我的意思与上述问题相同,只是数字是十进制的。我怎样才能做到这一点?这也可能吗?
猜你喜欢
  • 2016-03-16
  • 2017-08-08
  • 2015-07-10
  • 2017-08-07
  • 2018-09-15
  • 2015-10-27
  • 2019-01-23
  • 2014-01-01
  • 2012-09-26
相关资源
最近更新 更多