1

これは、信号を生成し、量子化し、エンコードし、復調する私のコードです。

 %Quantization
 n=8; 
 L=2^n; 
 vmax=8;
 vmin=-vmax;
 del=(vmax-vmin)/L;
 part=vmin:del:vmax;                   % level are between vmin and vmax with difference of del
 code=vmin-(del/2):del:vmax+(del/2);   % Contaion Quantized valuses 
 [ind,q]=quantiz(s,part,code);         % Quantization process
 

%  Encoding Process
figure;
code=de2bi(ind,'left-msb');   % Cnvert the decimal to binary
k=1;
l1=length(ind);
l2=length(q);
for i=1:l1
    for j=1:n
        coded(k)=code(i,j);   % convert code matrix to a coded row vector
        j=j+1;
        k=k+1;
    end
    i=i+1;
end

それを実行すると (既に pkg は quantiz 関数の通信をロードしました)、この行のエラーが発生します。

error: ones: invalid data type specified
error: called from
    de2bi at line 79 column 5
    PCM1 at line 33 column 6

(PCM1 はファイル名です) de2bi 関数から「left-msb」パラメーターを削除しようとしましたが、コードはエラーなしで実行されますが、最終出力は正しくないため、「left-msb」が必要です。私の知る限り、このコードは MATLAB で正常に動作しますが、試すための MATLAB キーがありません。

このエラーが何を意味し、どのように修正できるかについてのアイデアはありますか? 配列 ind はすべて正の値を持つ double 型であるため、関数が機能しない理由がわかりません。

編集: コードは Octave で実行されました。不要なコードを削除しました。

4

1 に答える 1

1

の実装において、Matlab と Octave の間に非互換性があるようですde2bi。Octave は、2 番目の入力が有意ビット フラグである de2bi への 2 入力呼び出しを適切に処理していないようです。最初の 2 つの入力として入力番号と列数の両方を指定する必要があります。その後、フラグは 3 番目の入力 (または別の基数を指定した場合は 4 番目) として正常に処理されます。Octave は、ベース値の空のプレースホルダーも処理しないように見えますが、表示する列の数は処理できます。

例:

>> de2bi(19)
ans =
     1     1     0     0     1

Matlab 2020a では、以下はすべて同じ出力を生成します。

>> de2bi(19,'left-msb')
ans =
     1     0     0     1     1

>> de2bi(19,[],'left-msb')
ans =
     1     0     0     1     1

>> de2bi(19,[],[],'left-msb')
ans =
     1     0     0     1     1

ただし、通信パッケージ 1.2.2 を使用する Octave 5.2.0 では:

>> de2bi(19)
ans =
   1   1   0   0   1

>> de2bi(19, 'left-msb')
error: ones: invalid data type specified
error: called from
    de2bi at line 79 column 5

>> de2bi(19,[],'left-msb')
ans =
   1   0   0   1   1

>> de2bi(19,[],[],'left-msb')
ans = [](0x0)

>> de2bi(19,[],2,'left-msb')
ans =
   1   0   0   1   1

>> de2bi(19,5,2,'left-msb')
ans =
   1   0   0   1   1

この互換性バグが報告されて修正されるまでは、表示する列数に空のプレースホルダーを使用し、基数に 2 を使用して、上記の最後から 2 番目の構文を使用するのが今のところ最善の修正方法のようです。この構文は、Matlab と Octave の両方で同じ出力を生成します。

バグ レポート 59466が Octave バグ トラッカーで作成されました。

更新: di2be の Octave バージョンと Matlab バージョンの間の互換性のない入力処理を修正する、上記のバグ レポートにパッチが提出されました。パッケージの更新バージョンがパッチでリリースされるまで上記の回避策が不十分な場合は、互換性のあるバージョンの di2be.m も含まれています。

于 2020-11-16T12:17:02.690 に答える