0

DSP プロセッサに BFSK アルゴリズムを実装する作業を行っており、定義済みの DSP インフラ ファイルを使用して LINUX で実装をシミュレートする必要があります。float 配列の形式で入ってくる入力データ。個々のビットは、入力から 1 つずつ抽出されます。変調された出力は、typdef 構造体の fprm で生成されます。これは、2 つの float 変数 (変調されたデータは複雑なベースバンド信号であるため、実部と虚部) で構成されます。ただし、DSP シミュレーションでは、出力を void ポインター配列に保存する必要があります。これは、DSP API が void ポインターの形式で必要とするため、変更できません。構造体の定義は次のとおりです。

typedef struct {
float re;
float im;
}complex_float;

memcpy を使用して、データを void ポインターにコピーできます。

sigbuf=(float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

memcpy(sigbuf, comSig, (bitsPerBlk*sigLen*sizeof(complex_float)));

sigbuf は、出力が保存される void ポインター配列であり、comSig は、変調された出力が保存される complex_float 配列です。問題は、sigbuf 配列の個々の値にアクセスできないことです。私もこれを試しました

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

しかし、それでもうまくいきません。

誰かが私を助けることができれば、それは私にとって非常に役に立ちます。

ありがとう、安州

4

4 に答える 4

2

ここで推測してみます。comSig のコピーを sigBuf に作成してから、それを API に渡してみませんか?

complex_float *sigBuf = malloc(TOTAL_SIZE_OF_COMSIG);
memcpy(sigBuf, comSig, TOTAL_SIZE_OF_COMSIG);

関数のドキュメントはわかりませんが、API がデータのバッファーへの void ポインターと、おそらくその長さまたは要素数を受け取るようです。

dsp_api(sigBuf, sigBufSize);

void ポインターとは何か、関数が何を望んでいるのかを誤解していると思います。void ポインターは、一部のデータへの単なる一般的なポインターです。これは、任意のデータを取り込む関数の方法であり、おそらくそれを complex_float 構造にキャストしてデータを操作します。

void ポインターを逆参照できなかった理由についての将来の参照として、サイズがないためです。それを型にキャストする必要があり、逆参照できるようになります。

于 2012-06-17T06:58:00.637 に答える
0

宛先アドレスsigbufが適切に配置されていることを確認してください。たとえば、DSPでは、4バイトのfloat値を4バイトの境界に揃える必要がある場合があります。memcpy()はアライメントをチェックしない可能性が高く、文句なしに個々のバイトをコピーします。ただし、sigbufが適切に配置されていない場合、floatとしてコンテンツにアクセスすることはできません(つまり、データがメモリからレジスタに読み込まれるときにデータが破損します)。

于 2012-06-17T00:53:35.647 に答える
0

sigbuf のタイプが (void *) の場合、あなたの行

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

に変更できるはずです

sigbuf=(void *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

malloc の左側は単なるキャストです。

于 2012-06-16T16:06:53.970 に答える
0

申し訳ありませんが、私の要点を明確に説明できなかったのは残念です。宣言は次のとおりです。

void *sigbuf;
complex_float *comSig;

complex_float

2 つの float 要素で構成される構造体です。

シグブフ

変調されたデータを保存し、さらに伝送システムに渡します。

コムシグ

complex_float 配列 (基本的には、sin 関数と cos 関数の出力の配列) です。

DSP インフラストラクチャには、変調された出力が必要です。

シグブフ

計算されて保存された

コムシグ

. somSig と sigbuf の両方が DSP インフラストラクチャで事前定義されています。

私の問題は、comSig aaray 全体を sigbuf 配列にコピーできたのに、sigbuf 配列の個々の要素にアクセスできなかったことです。

グローバル ポインター変数を介して comSig 配列自体のアドレスを渡すことで、この問題を回避できた方法はありますが、DSP インフラストラクチャはそうする自由を与えてくれます。というわけで、とりあえず問題は解決したようです。あんしゅさん、またよろしくお願いします。

于 2012-06-16T17:52:45.227 に答える