2015-08-19 5 views
1

Я ищу простой способ для преобразования из C-код шестигранного массива MatLabПреобразование шестнадцатеричных C массива в Matlab Vector

Доступен Формат 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]

Хотя просто c onvert для небольших чисел, мне нужно преобразовать очень большой массив. Я использую встроенную платформу, поэтому числа не могут быть записаны в простой текстовый файл для последующего чтения в Matlab. Его предпочтительнее написать код преобразования в Matlab.

Edit:

До сих пор в состоянии избавиться от 0x. Не удалось получить вектор после использования Eval функции, как указано ниже:

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

Вы хотите извлечь значения из исходных кодов/файлов заголовков C? –

+0

@ KlasLindbäck Вообще-то, у меня есть аудиоклип, представленный как c-код для микроконтроллера. Мне нужно было выполнить обработку сигнала в Matlab. Позже мне, возможно, придется сделать обратное тоже, то есть преобразовать матричный вектор в C-массив. – Galaxy

+0

Является ли это разовым или вам нужно делать это много раз? –

ответ

0

Это оказалось сложнее, чем я думал.

Содержание текстового файла 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 значений в каждой строке. Далее следует код MATLAB для преобразования значений HEX в десятичных чисел:

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 были огромную помощь :)

1

Скопируйте код, который определяет массив в файл с именем «clip.h».

Напишите небольшую программу c #include "clip.h" и используйте простой цикл для записи данных в нужном формате. Запустите программу на своем настольном компьютере. Это может выглядеть примерно так:

#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 на стандартный вывод, так что вам нужно, чтобы перенаправить его к нужному файлу.

+0

Спасибо за помощь. Возможно, вы пропустили часть моего сообщения.Теперь мне нужно искать, как uVision может писать в текстовый файл или искать достаточно маленький c-компилятор :) – Galaxy

Смежные вопросы