【问题标题】:Convert Hexadecimal C Array to Matlab Vector将十六进制 C 数组转换为 Matlab 向量
【发布时间】:2015-11-12 09:00:18
【问题描述】:

我正在寻找一种从 c 代码十六进制数组转换为 matlab 的简单方法

可用的 C 代码格式: const uint16_t AUDIO_SAMPLE[] = {0x4952, 0x4646, 0x4f6e, 0xf, 0x4157, 0x4556, 0x6d66, 0x2074, 0x12, 0, 0x1}

所需的 Matlab 格式: AUDIO_SAMPLE = [18770 17990 20334 15 16727 17750 28006 8308 18 0 1]

虽然转换为小数很简单,但我必须转换一个非常大的数组。我正在使用嵌入式平台,因此无法将数字写入简单的文本文件以供以后在 matlab 中读取。转换代码最好用matlab写。

编辑:

到目前为止能够摆脱0x。使用 eval 函数后获取向量失败,如下所示:

a='0x4952, 0x4646, 0x4f6e'; %Given
b = strrep(a, '0x', '') ; %Returns 4952, 4646, 4f6e
x = eval( [ '[', b, ']' ] ) %

【问题讨论】:

  • 是否要从 C 源代码/头文件中提取值?
  • @KlasLindbäck 实际上,我有一个作为微控制器 c 代码的音频剪辑。我需要在 Matlab 中对其进行信号处理。稍后我可能也需要做相反的事情,即将 matlab 向量转换为 C-Array。
  • 是一次性的还是需要多次这样做?
  • 目前只有一次。
  • 如果你有源代码,这个问题与“嵌入式”有什么关系?这是主机上的简单文件转换!使用 Python 转换文件。如果只需要一次,只需去掉 C 元素,留下逗号分隔的值,然后提供给 Python 程序。

标签: c arrays matlab hex


【解决方案1】:

将定义数组的代码复制到名为“clip.h”的文件中。

编写一个#include "clip.h" 的小c 程序,并使用一个简单的循环将数据写入所需的格式。在您的台式计算机上运行该程序。它可能看起来像这样:

#include <stdio.h>
#include <stdint.h>
#include "clip.h"
#define NUMBERS_PER_LINE 20

int main(void) {
    int i;
    int sample_length = (sizeof AUDIO_SAMPLE)/(sizeof AUDIO_SAMPLE[0]);

    printf("AUDIO_SAMPLE = [ ");
    for (i=0; i < sample_length; i++) {
        printf("%" PRIu16 PRId16, AUDIO_SAMPLE[i]);  // Use the format specifier for uint16_t.
        if (i % NUMBERS_PER_LINE == NUMBERS_PER_LINE - 1) {
            // Insert line continuation mark
            printf(" ...\n  ");
        }
    }
    return 0;
}

程序会将matlab代码写入stdout,所以需要重定向到想要的文件。

【讨论】:

  • 感谢您的帮助。也许你错过了我帖子的后面部分。现在我必须搜索 uVision 如何写入文本文件或搜索足够小的 c 编译器 :)
【解决方案2】:

事实证明,这比我想象的要艰难。

文本文件的内容audio.c

4952, 4646, 0x4f6e, 0xf, 0x4157, 0x4556, 0x6d66, 0x2074, 0x12, 0, 0x1, 
0x2, 0xbb80, 0, 0xee00, 0x2, 0x4, 0x10, 0, 0x6166, 0x7463, 0x4, 
0, 0xd3cf, 0x3, 0x6164, 0x6174, 0x4f3c, 0xf, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

给定文件的每一行有 11 个值。下面是将 HEX 值转换为十进制数的 MATLAB 代码:

fp = fopen('audio.c', 'rt');
C = textscan(fp, '%s', 'CommentStyle', '#', 'Delimiter', '');
fclose(fp);

C = regexp(C{:}, '\w+', 'match');
C = cellfun(@(x)strrep(x,'0x',''), C, 'UniformOutput', false);
C = cellfun(@(x)hex2dec(x), C, 'UniformOutput', false);
result=cell2mat(C)'
allOneString = sprintf('%d, ' , result)

最后我有一串用逗号分隔的十进制值,如下所示:

18770, 17990, 20334, 15, 16727, 17750, 28006, 8308, 18, 0, 1, 2, 48000, 0, 60928, 2, 4, 16, 0, 24934, 29795, 4, 0, 54223, 3, 24932, 24948, 20284, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

当然,以前关于 SO 的帖子有很大帮助 :)

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 2017-07-31
    • 2013-07-20
    • 2012-06-17
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多