0

私はFezPanda2を介してマイクからサウンドサンプルを取得しようとしています。それを実現するためにrlpを使用しています。これが私のコードです:

int GHAL_AnalogIn_Read(unsigned char channel)
{
        return ((*((int*)(ADC_DATA_BASE_ADDRESS) + channel)) >>8) & 0x3FF;
}
int ReadAudio(unsigned int *generalArray, void **args, unsigned int argsCount ,unsigned int *argSize)
{
        unsigned char *buffer = (unsigned char*)args[0];
        int buffer_lengh = argSize[0];
        unsigned char channel = *(unsigned char*)args[1];
        int i=0;
        while(i<buffer_lengh)
        {
           buffer[i] = GHAL_AnalogIn_Read(channel);
           i++;
           RLPext->Delay(100);
        }
        return 0;
}

問題は、これらのサウンドサンプルでfftを実行しているため、unsignedcharではなくfloat値が必要なことです。したがって、float値を提供する変更が必要です。何か案は?

4

1 に答える 1

0

Cの経験はありますか?特にとの意味*&*意味:アドレスが指す値を取得します。したがって、void ** argsは、「アドレスから取得した値が指す値を取得する」のようなものを言います。voidは、好きなものを自由に入力するために使用されます。構造体またはオブジェクト全体を引数に入れることはできないため、構造体またはオブジェクトへのポインター(アドレス)を指定します。を使用する*と、引数のアドレスの値を取得できます。

Cでは、引数に配列全体を渡すのではなく、最初のインデックスのアドレスを渡します。

これで、関数を次のように単純にリファクタリングできます。

int ReadAudio(unsigned int *generalArray, float arg, unsigned int argsCount ,unsigned int *argSize)

しかし、void **args現在バッファを指しているように、収集されたデータに対して実行する操作を知っておく必要があると思います。アナログ読み取りは常に整数を提供します。ほとんどのADC(アナログ-デジタル-コンバーター)は10ビット程度です。

32ビットシステムでfloatが4バイトの場合、unsigned char *buffer4バイト境界でデータ()をマングルする必要があります。

編集:私はドキュメンテーションでこれを見落としました:Note: Parameter of all function in RLP code file must have format follow this:Note: Parameter of all function in RLP code file must have format follow this:。バッファバイトを4バイト境界でfloatにキャストするだけで、うまくいくと思います。

于 2013-02-21T19:48:44.663 に答える