1

操作後のオーディオ データの再生に問題があります。私が使用する唯一の API は、Linux (Ubuntu) 上の C 言語の alsa lib API です。read() を使用して unsigned char 配列 (buffer1 と呼ばれる) の 16 ビット整数 wave ファイルからデータを取得し、buffer1 を適切に再生できます。同じサイズの別の unsigned char 配列 (buffer2 と呼ばれる) にデータを渡す必要があります。buffer2[i] = buffer1[i] でループを作成すると、動作します: buffer2 は適切に再生できます。しかし、データを操作するために、それを float 配列に変換してから unsigned char に戻します (今まではオーディオ データを操作していません。float に変換してから unsigned char に戻して、その動作をテストします)。しかし、現在、buffer2 の値はすべて buffer1 の値と厳密に同じですが、buffer2 は音を立てません (buffer1 と buffer2 の多くの値の printf を作成しました。

何が問題なのですか?

ビクター

4

1 に答える 1

0

buffer1とbuffer2の値を同じにすることはできません。そうしないと、機能します。おそらく、printfコマンドで使用するフォーマットは、違い(%i、%fなど)をマスクしています。printfを使用するのではなく、ブレークポイントを設定し、デバッガーを使用して値を確認してみてください。これは、実際に何が問題になっているのかを明らかにするのに役立つ場合があります。

編集:

あなたがキャストをどのように演じているかについてのあなたのコメントを考えると、私は今助けることができると思います。入ってくる生データはunsignedchar型です。ほとんどのプラットフォームでは、これは0〜255の整数値になります。操作を行うには、この値をfloatに変換する必要があります。データを任意の操作の浮動小数点型として意味のあるものにするには、この範囲を+/-1.0の間でスケーリングする必要があります。これは、次のコードでの「scale」変数の目的です。

#include <iostream>
#include <math.h>

int main()
{

    const int BUFFER_LEN = 6;
    const unsigned char channelDataIN[] = {0,255, 1, 254, 2, 253};

    unsigned char channelDataOUT[BUFFER_LEN];
    float channelDataF[BUFFER_LEN];

    std::cout.precision(5);

    float scale = powf(2.f, 8.f*sizeof(unsigned char) ) - 1.f;


    for (int mm = 0; mm < BUFFER_LEN; ++mm)
    {        
        std::cout << "Original = " << (int)channelDataIN[mm] << std::endl;

        channelDataF[mm] =  (float)(channelDataIN[mm]) * 2.f/scale - 1.f; //Float cast
        std::cout << "Float conversion = " << channelDataF[mm] << std::endl;

        channelDataOUT[mm] = (unsigned char) ceil(  ( 1.f+channelDataF[mm] ) * scale/2.f    );
        std::cout << "Recovered = " << (int)channelDataOUT[mm] << std::endl;

        if (channelDataIN[mm] == channelDataOUT[mm])
            std::cout << "The output precisely equals the input" << std::endl << std::endl;
        else
            std::cout << "The output != input" << std::endl << std::endl;
    }

    return 0;
}

値を元に戻した後のunsignedcharsの出力配列は、入力配列と同じです。これはコードからの出力です。。。

Original = 0
Float conversion = -1
Recovered = 0
The output precisely equals the input

Original = 255
Float conversion = 1
Recovered = 255
The output precisely equals the input

Original = 1
Float conversion = -0.99216
Recovered = 1
The output precisely equals the input

Original = 254
Float conversion = 0.99216
Recovered = 254
The output precisely equals the input

Original = 2
Float conversion = -0.98431
Recovered = 2
The output precisely equals the input

Original = 253
Float conversion = 0.98431
Recovered = 253
The output precisely equals the input
于 2012-03-29T19:37:57.870 に答える