上記の問題に基づいた割り当てがあります。サンプルあたりのサンプリング頻度とサイズは、問題で既知です。これに必要なコーディングの種類についてのアイデアが必要です。
質問する
658 次
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]
書き込み、バイナリ モードでサンプルごとにテキスト ファイルを開き、オーディオ データをループして、単一のサンプル/チャネルのバイトを読み取り、それらを使用するfprintf
かfwrite
、正しいファイルに書き込むことができます。
于 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 データをメモリにロードしたと仮定すると、必要なことは次のとおりです。
- 2 つの出力ファイルを開きます (を使用
fopen()
)。 - サンプル データをループし、サンプルごとに次の操作を行います。
- 左チャンネルの値を最初のファイルに入れます
- 右チャンネルの値を 2 番目のファイルに入れます
- ファイルを閉じます。
于 2013-02-07T10:00:59.033 に答える