2017-01-05 11 views
0

私は24ビットUSBオーディオストリームを32ビットストリームに変換しようとしていますので、マイコンの周辺機器はストリームで楽しく再生できます(16ビットまたは32ビットデータほとんどのマーカスのように...)。24ビットUSBオーディオストリームを32ビットストリームに変換する

次のコードは、mcuの会社から得たものです。期待どおりに動作せず、実際に歪んだオーディオが得られました。

// Function takes usb stream and processes the data for our peripherals 
// @data   - usb stream data 
// @byte_count - size of stream 
void process_usb_stream(uint8_t *data, uint16_t byte_count) { 
    // Etc code that gets buffers ready to read the stream... 
    // Conversion here! 
    int32_t *buffer; 
    int sample_count = 0; 
    for (int i = 0; i < byte_count; i += 3) { 
     buffer[sample_count++] = data[i] | data[i+1] << 8 | data[i+2] << 16; 
    } 
    // Send buffer to peripherals for them to use... 
} 

データを24ビットストリームから32ビットストリームに変換する際の助けがあれば、すばらしいことでしょう。仕事のこのエリアには、私にとって非常に困難である:(、また、DSPでhttp://dsp.stackexchange.com

上のビット深度を変更するプロセスを、この質問を投稿した場合

答えて

1

data[...]はuint8_tです。 data[...]<<8data[...]<<16は定義されていないので、シフトする前にキャストする必要があります。彼らは0か変わらない、どちらもあなたが望むものではありません。

また、フルレンジを取得し、符号ビットを正しい場所に配置するには、別の8ビット分シフトする必要があります。

また、データをリトルエンディアン形式のデータとして扱います。それが正しいことを確認してください。私はそれが正しいだと仮定しますので、このようなものは動作します:

int32_t *buffer; 
int sample_count = 0; 
for (int i = 0; i+3 <= byte_count;) { 
    int32_t v = ((int32_t)data[i++])<<8; 
    v |= ((int32_t)data[i++])<<16; 
    v |= ((int32_t)data[i++])<<24; 
    buffer[sample_count++] = v; 
} 
最後に

、これはbyte_countが3で割り切れることを前提としています - それは本当だことを確認してください!

+0

こんにちはマット、あなたが 'int32_t'を置くと、あなたはそれが署名されたデータでなければならないと言っていますか?私はそれを 'uint32_t'型に入れていませんか? –

+0

符号付きと符号なしの24ビットと32ビットの両方の形式が使用されていますが、署名付きの形式が一般的です。あなたが 'int32_t * buffer'を指定していて、何の符号変換もせずにバイトを詰め込んでいたので、両方とも署名されていると仮定しました。 –

+0

ああ意味する。そして、確かに私はそれが何を入れているかを確認するために再びサンプルコードを見ていました。そして、はい、彼らは符号付きの32ビット整数を入れました。あなたのアルゴリズムを試してみましょう! –

1

これはDSPのものは、スケーリングと呼ばれている

    ビット分解能が16777216の 可能な値を有する係数が256であるよう
  • 16ビット分解能が65536個の値
  • 24は
  • 32ビットは、4294967296個の値を有しています

https://electronics.stackexchange.com/questions/229268/what-is-name-of-process-used-to-change-sample-bit-depth/229271 24ビットから16ビットへ 還元はを縮小と呼ばれ、これは8
によりすべてのビットをシフトするビット単位によって行うことができる256

によって各値を割ることによって行われるによりますy = x >> 8。このようにスケールダウンすると、LSBが失われます。

から32ビットへのスケールアップはこれを行う方法がより複雑です。それは、値の各ビットに20と28の間の値を掛けることによって機能するかもしれません。

32ビットレジスタの24ビット値を押し、次に左シフト2⁰と2⁸の値によって各ビットを

data32[31] = data32[23] << 8; 
data32[22] = data32[14] << 8; 
... 
data32[0] = data32[0]; 

及びこの(線形補間)で取得しないビットを補間

たぶんずっと良いがスケールアップされているalgortihmsは...スケールアップの問題のためにもhttp://blog.bjornroche.com/2013/05/the-abcs-of-pcm-uncompressed-digital.htmlhttp://dsp.stackexchange.com

を参照してくださいに尋ねる

+0

ありがとうございます!後見では、DSPセクションにも投稿していたはずです。私はこれらのリンクを見て、私が得たものをあなたに知らせるでしょう!しかし、これは間違いなく私が探していたものです、ありがとう! –

関連する問題