RESAMPLE関数​とスタンドアローン実​行ファイルについて

お世話になっております。 ver.2013(a)を使用しております。
この度、resample関数を含むソースファイルTEST.mをmccでコンパイルし、スタンドアローン実行ファイルにしようとしております。 (他のプログラミング言語で書かれた実行ファイルとともにスクリプトで実行することを考えております。) このTEST.mをmatlabのGUI上で実行する分には問題がありませんが、mccでのコンパイル後にコンソールから実行すると以下の警告が出力されます。
operands to the and && operators must be convertible to logical scalar values
Error in resample (line 66)
2015(a)以降にこのエラーが解決されたというmatlab answerのページがありましたが、
(https://jp.mathworks.com/matlabcentral/answers/293380-resample-example-from-mathworks-site-not-working-for-me)
現在使用しているver. 2013(a)では解決策はございますか?
よろしくお願いいたします。

 Accepted Answer

michio
michio on 13 Oct 2016
Edited: michio on 13 Oct 2016
resample も複数ありまして状況に合わせて適切なものが呼び出されます。Signal Processing Toolbox の resample に加えて、MATLAB本体にも timeseries クラスの resample メソッドなど。
今回、コンパイル後の実行ファイルのみでエラーが発生するということで、正しい resample 関数が認識できていないのでは推測しています。
mcc コマンドを使用したビルドですと -a オプションで明示的に指定できます。
mcc -m TEST.m -a filename.m
と続けて -a の後ろにファイル名(上記例では filename.m) やクラス名で指定します。こちらは既にお試しいただきましたでしょうか。
また、下記のページにも紹介しておりますが同様の機能として %#function プラグマを使用する方法がございます。コンパイルするメインファイル (上記ですと TEST.m) に
%#function timeseries
と記載していただきますと、_timeseries_ をビルド時に実行に必要な関数、クラスとして認識させることができます。上記コマンドの記入する場所に関しては特に指定はありませんので、ソースコードの管理上、優位な位置に記載ください。
対応するドキュメンテーションページは下記です。
  1. コールバック問題の修正: 欠落した関数
  2. %#function
もし上記でも解決しない場合は、実際の問題を特定するために現象を再現することができる簡単なサンプルプログラムを頂ければと。

4 Comments

Michio様、
お忙しい中、返信ありがとうございます。
resampleが複数存在するのは知りませんでした。 今回はSignal processing toolboxのサンプリング周波数を変化させる関数を利用しています。
ご教授くださったように、mccの-aオプションとプラグマでコンパイルしてみましたが、同様の警告が出ました。
-aオプションのコマンドは次のようにしました。
mcc -m TESTSAMPLE.m -a signal_processing_toolbox_path
signal_processing_toolbox_pathはツールボックスへの絶対パスを表しています。 私の理解が浅く、オプションの使用方法が誤りでしたら申し訳ございません。
プラグマに関しては 下記のサンプルプログラムにあるように、
%#function resample
%#function signal_processing_toolbox_path
で試してみました。これに関しても誤りであるならば申し訳ございません。
使用したサンプルプログラムは オーディオファイル名とそのサンプリング周波数を引数として、そのファイルのデータを取得後、サブ関数testresampleにそのデータを渡し、サンプリング周波数を10000Hzに変更してデータを返すというものです。実際はオーディオファイルのデータを加工していますが、その部分は省略しています。 適当なwavファイル(16000Hzサンプリング)をテストで使っています。 お手数おかけいたしますが、よろしくお願いいたします。
function [ dat2 ] = TESTSAMPLE( filename1, fs )
%#function resample
fprintf('TESTSAMPLE\n');
dat1 = audioread(filename1);
dat2 = testresample(dat1,fs);
end
function x2 = testresample(x, fs2)
fs = 10000;
if fs2 ~= fs
x2 = resample(x, fs, fs2);
end
end
michio
michio on 13 Oct 2016
Edited: michio on 13 Oct 2016
詳細にご説明いただきありがとうございます。 例えばコンパイルして
TESTSAMPLE.exe handel.wav 20000
と実行しますと2つ目の入力引数は数値ではなく文字列として解釈されます。結果、
if fs2 ~= fs
の部分で文字列と数値の比較となり、ご指摘のエラーが発生することは確認できました。
では、「システム プロンプトから実行可能ファイルへ渡す入力引数は、入力文字列として受け取られます。異なる形式のデータ (たとえば double) が必要な場合、まず、入力文字列を MATLAB コードで必要な形式に変換しなければなりません。たとえば、入力文字列を数値データに変換するには STR2NUM を使用できます。」などとありますが、こちらが該当するのではと考えております。
例えば、
if ischar(fs)
fs = str2double(fs);
end
dat2 = testresample(dat1,fs);
と文字列を数値に変換するコマンドを追加すると解決しますでしょうか。
gr0221ss
gr0221ss on 13 Oct 2016
ありがとうございます。
引数の型とは…。基本的なことが抜けていたようです。
数値に変換したところ、エラーがなくなりました。
お忙しいところお手間を取らせて申し訳ございませんでした。
今後ともよろしくお願いいたします。
michio
michio on 13 Oct 2016
解決した旨ご連絡ありがとうございます。安心いたしました。
できましたら回答のAcceptもよろしくお願いします。

Sign in to comment.

More Answers (0)

Products

Asked:

on 12 Oct 2016

Commented:

on 13 Oct 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!