【发布时间】:2014-05-19 19:35:48
【问题描述】:
我用 C++ 编写了以下代码(示例代码)来修改原始 .wav 文件中存在的数据并将修改后的数据写入新创建的文件。该程序为声音提供“回声效果”(注意:- 这是为只有 2 个通道的 wav 文件编写的)。
#include <iostream>
#include <conio.h>
#include <fstream>
#ifndef endl
#define endl "\n"
#endif
#define wav_eco(filin, fileout, eco_rate) \
char temp[2]; \
char ch[eco_rate][2], ch2[eco_rate][2]; \
int i,j; \
for(i=0; i<eco_rate; i++) \
for(j=0; j<2; j++) \
ch2[i][j] = 0; \
while(!filin.eof()) \
{ \
for(i=0; i<eco_rate && !filin.eof(); i++) \
filin.read((char*)&ch[i], sizeof(char[2])); \
for(i=0; i<eco_rate; i++) \
{ \
temp[0] = ch[i][0]; \
temp[1] = ch[i][1]; \
ch[i][0]+=ch2[i][0]; \
ch[i][1]+=ch2[i][1]; \
fileout.write((char*)&ch[i], sizeof(char[2])); \
ch2[i][0] = temp[0]; \
ch2[i][1] = temp[1]; \
} \
}
using namespace std;
struct WAVEFILEHEADER
{
char ChunkId[4];
int ChunkSize;
char Format[4];
char SubChunkFmt[4];
int SubChunkFmtSize;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
char ChunkData[4];
int SubChunkDataSize;
};
int main()
{
fstream filin("C:\\Users\\chess.Admin-PC.000\\Music\\ExampleRead.wav", ios::in|ios::binary);
fstream fileout("C:\\Users\\chess.Admin-PC.000\\Music\\ExampleWrite.wav",ios::out| ios::binary);
WAVEFILEHEADER wav;
filin.read((char*)&wav,sizeof(wav));
//to display the contents of the header
cout<<wav.ByteRate
<<endl<<wav.ChunkSize
<<endl<<wav.SampleRate// no of samples per second
<<endl<<wav.SubChunkDataSize
<<endl<<wav.SubChunkFmtSize
<<endl<<wav.ChunkData
<<endl<<wav.ChunkId
<<endl<<wav.Format
<<endl<<wav.SubChunkFmt
<<endl<<wav.AudioFormat
<<endl<<wav.AudioFormat
<<endl<<wav.BitsPerSample//no of bits per second
<<endl<<wav.BlockAlign
<<endl<<wav.NumChannels
<<endl<<endl<<sizeof(wav); /* size of the wav variable*/
getch();
fileout.write((char*)&wav, sizeof(wav));/// write the header to output file
wav_eco(filin,fileout,10000) ///modify the data and update the output file
filin.close();
fileout.close();
return 0;
}
/*algorithm implemented by the wav_eco function(this is not some stranded algorithm. I wrote it myself) :-
1) obtain the 'echo_rate' of the samples
2) read the data present in the original wav file
3) write this data, by adding each sample from the previously obtained data to the data that was read now
4) follow steps 2 and 3 until eof is reached
*/
程序运行良好,当我使用 windows 媒体播放器播放输出文件时,我得到了回声效果,但另外我得到了“嘶嘶”的声音。是什么原因造成的,我必须以什么方式修改上面的代码来避免它?是否可以简化wav_eco() 宏以减少程序的计算时间?
我对嘶嘶声的猜测是因为添加了ch[i][0] += ch2[i][0]; ch[i][1]+=ch2[i][1];。它是否以错误的方式修改声音? (这是我第一次编辑声音)
【问题讨论】:
-
抱歉拼写错误:eco 而不是 echo
-
它通过回收声音使声音文件对环境更加友好。 ;-)
-
WAV 数据格式是什么? 8 位还是 16 位? PCM还是别的?每种格式需要不同的算术。
-
十六位。它包含 2 个频道