2013年2月6日水曜日

byte -> short -> byte そしてfloat(Objective-C)

こんにちは信号処理とデバイスまわりでのデータ移動のために必要なものを実装しておきました。iOS, Mac OS で活用できると思います。
何に使うかといえば特に音声系です。

Byte : Low Level APIでの扱い
short(Int16) :  16bitのデータ, 音声系は16bit, 32b it系が多いのでしょうか
float : FFT等の信号処理のライブラリはfloat, doubleが多いのでこれらの変換も必要

これらの値をさくっと変換して計算に活用したいというのが今回の目的です
short はだいたいの処理系で16bitでしょうか。わかりやすくするためObjective-CのInt16を使いましょう。

もう少しByte, short について。  このプログラムは 2 byteのデータを1つのshort(Int16) に変換するものです

プログラムリスト
•Byte配列 -> short(Int16)
•short(Int16) -> Byte配列
•short(Int16) -> float
•float -> short(Int16)

•byte配列 -> short(Int16)

+(SInt16)convertByteToShort:(Byte *)bytes order:(BOOL)order
{
    if ( order )
    {
        // Small address first
        SInt16 res = (bytes[0] << 8) + bytes[1];
        return res;
    }
    else
    {
        SInt16 res = (bytes[1] << 8) + bytes[0];
        return res;
    }
}
※エンディアン系の処理のためちょっと変則的なコードになっています

•short(Int16) -> byte配列
+(void)convert16ToByte:(SInt16)src bytes:(Byte *)bytes order:(BOOL)order
{
    if ( order )
    {
        bytes[0] = (src & 0xFF00) >> 8;
        bytes[1] = (src & 0xFF);
    }
    else
    {
        // Small address first
        bytes[1] = (src & 0xFF00) >> 8;
        bytes[0] = (src & 0xFF);
    }
}


•short(Int16) -> float
+(float)getNormarilize16Bit:(SInt16)signal
{
    return (float)signal / (float)32768;
}


•float -> short(Int16)
+(SInt16)restore16Bit:(float)signal
{
    return (SInt16)(signal * 32768);
}





0 件のコメント:

コメントを投稿