Невозможно преобразовать код Matlab в код C с помощью Matlab Coder - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть код MATLAB, показанный ниже.Я пытаюсь преобразовать этот код в код C с помощью MATLAB Coder, но я обнаружил ошибку.

enter image description here

Ожидается либо логическое, char, int, fi, single,или двойной.Нашел mxArray.MxArrays возвращаются из вызовов интерпретатора MATLAB и не поддерживаются внутри выражений.Их можно использовать только в правой части назначений и в качестве аргументов для внешних функций.

% Applies A-weighted filtering to sound and draws it's plot
% in a figure as output.
function A_filtering
coder.extrinsic('tic')
coder.extrinsic('toc')
coder.extrinsic('display')
sampleRate = 44100;
reader = dsp.AudioFileReader('Jet_Flypast.wav');
fs = 44100;
weightFilter = weightingFilter('A-weighting',fs);
% fileWriter = dsp.AudioFileWriter('SampleRate',fs);
% visualize(weightFilter,'class 1')
scope = dsp.SpectrumAnalyzer('SampleRate',fs,...
    'PlotAsTwoSidedSpectrum',false,...
    'FrequencyScale','Log',...
    'FrequencyResolutionMethod','WindowLength',...
    'WindowLength',sampleRate,...
    'Title','A-weighted filtering',...
    'ShowLegend',true,...
    'ChannelNames',{'Original Signal','Filtered Signal'});

tic
while toc < 60
    x = reader();
    y = weightFilter(x);
    scope([x(:,1),y(:,1)])
    display(x(:,1))
end

release(scope);
release(weightFilter);
release(reader);
end

Этот вопрос может быть повторен, но я искал в Интернете и не смог найти связанных сообщений,Есть ли способ решить эту ошибку?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы объявили tic, toc как внешнее, что является правильным, поскольку они не поддерживаются для генерации кода.Поскольку они являются внешними, результаты этих функций не могут быть непосредственно использованы в других выражениях.Кодер не знает содержания этих результатов во время выполнения.Но вы можете дать подсказки по их типам, назначив их результаты известным переменным.Вы должны заменить строку

while toc < 60

следующими строками

tElapsed = 0;
tElapsed = toc;
while tElapsed < 60

Поскольку мы инициализировали tElapsed с 0, это известный тип двойного скаляра.Выходные данные toc будут преобразованы в этот тип, когда он назначен для tElapsed.

Также обратите внимание, что ваш код будет работать нормально, когда вы генерируете mex-файл с использованием MATLAB Coder.Но вы не можете сгенерировать автономный код из этого, так как внешние функции требуют MATLAB для запуска.

...