2

上記の問題に基づいた割り当てがあります。サンプルあたりのサンプリング頻度とサイズは、問題で既知です。これに必要なコーディングの種類についてのアイデアが必要です。

4

3 に答える 3

3

このようなファイル形式仕様を使用して、ファイル ヘッダーの読み取り方法、サンプル レート、ビット レートなどの決定方法を確認します。

The canonical WAVE format starts with the RIFF header:

0         4   ChunkID          Contains the letters "RIFF" in ASCII form
                               (0x52494646 big-endian form).
4         4   ChunkSize        36 + SubChunk2Size, or more precisely:
                               4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
                               This is the size of the rest of the chunk 
                               following this number.  This is the size of the 
                               entire file in bytes minus 8 bytes for the
                               two fields not included in this count:
                               ChunkID and ChunkSize.
8         4   Format           Contains the letters "WAVE"
                               (0x57415645 big-endian form).

The "WAVE" format consists of two subchunks: "fmt " and "data":
The "fmt " subchunk describes the sound data's format:

12        4   Subchunk1ID      Contains the letters "fmt "
                               (0x666d7420 big-endian form).
16        4   Subchunk1Size    16 for PCM.  This is the size of the
                               rest of the Subchunk which follows this number.
20        2   AudioFormat      PCM = 1 (i.e. Linear quantization)
                               Values other than 1 indicate some 
                               form of compression.
22        2   NumChannels      Mono = 1, Stereo = 2, etc.
24        4   SampleRate       8000, 44100, etc.
28        4   ByteRate         == SampleRate * NumChannels * BitsPerSample/8
32        2   BlockAlign       == NumChannels * BitsPerSample/8
                               The number of bytes for one sample including
                               all channels. I wonder what happens when
                               this number isn't an integer?
34        2   BitsPerSample    8 bits = 8, 16 bits = 16, etc.
          2   ExtraParamSize   if PCM, then doesn't exist
          X   ExtraParams      space for extra parameters

The "data" subchunk contains the size of the data and the actual sound:

36        4   Subchunk2ID      Contains the letters "data"
                               (0x64617461 big-endian form).
40        4   Subchunk2Size    == NumSamples * NumChannels * BitsPerSample/8
                               This is the number of bytes in the data.
                               You can also think of this as the size
                               of the read of the subchunk following this 
                               number.
44        *   Data             The actual sound data.

その後、次のようにインターリーブされた生の pcm データが見つかります。

[sample 1      ][sample 2      ]
[s1,ch1][s1,ch2][s2,ch1][s2,ch2]

書き込み、バイナリ モードでサンプルごとにテキスト ファイルを開き、オーディオ データをループして、単一のサンプル/チャネルのバイトを読み取り、それらを使用するfprintffwrite、正しいファイルに書き込むことができます。

于 2013-02-07T10:01:10.137 に答える
1

サンプリング周波数はこれには関係ありませんが、サンプルあたりのサイズ (通常、サンプルあたりチャネルあたり 8 ビットまたは 16 ビット) によって、使用する必要があるポインタ サイズが決まるため、ここではチャネルあたり 8 ビットの例を示します。

char* reader = begin; // interleaved
char* left = malloc(numsamples); // de-interleaved
char* right = malloc(numsamples);
while(reader<end) {
    *left = *reader;
    ++left;
    ++reader;
    *right = *reader;
    ++right;
    ++reader;
}

2 チャネルの 16 ビット インターリーブ オーディオに対して同じことを行うには、3 つのバッファすべてを宣言しshort*、代わりにmalloc(numsamples*2)

于 2013-02-07T10:03:48.560 に答える
0

WAV データをメモリにロードしたと仮定すると、必要なことは次のとおりです。

  1. 2 つの出力ファイルを開きます (を使用fopen())。
  2. サンプル データをループし、サンプルごとに次の操作を行います。
    • 左チャンネルの値を最初のファイルに入れます
    • 右チャンネルの値を 2 番目のファイルに入れます
  3. ファイルを閉じます。
于 2013-02-07T10:00:59.033 に答える