-8

更新 2

私は自分の pic 18f4550 でサウンド (赤、緑、青と言うことができます) を再生できるプログラムを作りたいです picdem に接続されたスピーカーがあり、その部分は正常に動作します。コンパイラ。

赤と言うと、.wav ファイルのビット値を取得する必要があります (これにはビット パターンがあります)。私の正しい質問は、.wav ファイルのビット値を取得する方法です。

void main (void)
{   

    TRISD = 0x00;               // PORTD  als uitgang
    TRISB = 0b00110000;         // RB4 en RB5 als ingang
    TRISA = 0x00;               // RA output
        
    RCONbits.IPEN = 0;  // interrupts
    INTCONbits.GIE = 1; 
    INTCONbits.RBIE = 1;
    
    while(1)
    {   
        _asm sleep _endasm  
    }
}

#pragma interrupt ISR
void ISR (void)
{
    int red[] = {bit values off sound red???};
    int blue[] = {bit values off sound green???};
    int green[] = {bit values off sound blue???};


    if (INTCONbits.RBIF==1)
    {
        if(PORTBbits.RB5==0)        // S3 pressed?
        {
            int i = 0;
            int b;
            do {
                LATAbits.LATA2 = rood[i];
                LATDbits.LATD1 ^= 1;
                b = 0;

                //do-while voor de frequentie (1500 is de freq)
                do {
                    b++;
                }while(b <= 2000);

                i++;
            }while(rood[i] <= 50);

            //LATDbits.LATD1 ^= 1;      // D2 togglen

        }
        
    }   
    INTCONbits.RBIF = 0;
}
4

3 に答える 3

2

元の質問への回答: あなたが求めた「赤の周波数、ビットで表す」は480から405 THzなので、ビットは111100000から110010101です。しかし、「ナノメートルで定義されている」とも言ったので、630から740nmですこれは、バイナリで 1001110110 ~ 1011100100 です。スピーカーを波形で駆動したい場合は、サンプル オーディオ波形または音声合成チップが必要です。どちらの場合でも、私があなたに与えたバイナリ値は、「赤」という単語の音とは何の関係もありません。これは、可聴音を表すためにさらに多くのビットを必要とします (たとえば、16 kbps PCM で最小 0.5 秒は 8 kbp になります)。 = 1 キロバイト)。

バイナリで色を表す別の方法は、赤が 0xFF0000 になる RGB システムです。これは、バイナリで 111111110000000000000000 です。

wav ファイルのビットを取得する方法に関する質問への回答 まず、wav ファイルが保存されている場所を特定する必要があります。これは、PIC に const 配列として格納することも、ある種のシリアルまたはパラレル バスを介して読み取る必要がある外部メモリ デバイスに格納することもできます。PIC18F4550 には 32k バイトのフラッシュがあるため、プログラムがかなり小さい場合、3 つの wav ファイル用に十分なスペースが残っている可能性があります。

次に、ハードウェアがサウンドを再生する方法を決定する必要があります。シフトしてビットポートからバイト値を送信しようとしているようです。しかし、これを正しく行うには、ハードウェアについてもっと知る必要があります。なぜなら、スピーカーをビット ポートに接続してサウンド出力を期待することはできないからです (いずれにせよ、PCM 信号をさらに処理することなくではありません。1 ビット DAC設計を試みていますか? もしそうなら、 、ここにさらに注意事項がありますが、これは非常に野心的です)。

それとは別に、wav ファイルのビット値は、ファイル内の各サンプル (8 ビット?) を取得し、0x01 のマスク値をビットごとの AND 演算でシフトして、どのビットが設定されたかを判断することによって取得されます。

于 2011-05-03T12:25:44.293 に答える
1

英語の一部の文字のエンコードを構成するバイナリ値と、エンコードされた単語を言う人の音のサンプリングされたバージョンを構成する PCM 値との間には、まったく相関関係がありません。

誰かが「赤」と言っている音を再生したい場合は、まずそれをサンプリングし、結果のビットをどこかに保存してから、適切なビットレートで出力に送ります。サンプリングされたサウンドは、「赤」の ASCII 表現 (24 ビット) よりもはるかに大きい可能性があります。

そのようなサンプルを含み、ASCII でエンコードされた単語を指定して実際に音を生成できる統合チップがあります。1 つの例がこれです。そのようなチップが MCU に接続されていない限り、あなたの質問はあまり意味がありません。

于 2011-05-02T17:50:00.873 に答える
1

コメントで述べたことに基づいて、のような文字列の ASCII 表現からビットのストリームを取得したいよう"red"です。これを行うには、文字列の各文字をループしてから、各ビット位置をループします。

const char *str = "I hate programming";

// Loop over each character
for (i = 0; i < strlen(str); i++)
{
    // Loop over each bit
    for (j = 0; j < 8; j++)
    {
        // Extract bit #j of character i, using bit-shift and mask
        bit = (str[i] >> j) & 1;

        // bit will be 0 or 1, so do something with it here
    }
}

各文字のビットを逆の順序にしたい場合は、内側の ( j) ループの順序を逆にします。

@unwind が彼の回答で述べているように、これは話し言葉の音声波形を実際に生成することとは何の関係もないことに注意してください。

于 2011-05-02T17:41:44.640 に答える