Tag: wav

如何将内存中的音频数据保存为wav文件?

当应用程序在Windows上调用waveOutWrite(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)时,我会保存一份发送到内存中音频卡的音频数据(由pwh-> lpData指向)。 现在我想将音频数据保存为磁盘上的WAV格式文件,我该怎么做? 我有指向音频数据块的指针和audo数据的大小。

将URL传递给从WAV文件中提取样本的特定示例代码

我不知道在SOF上访问这样一个特定问题是否合法,但我在这里: 我发现了这段精彩的代码 ,它从WAV文件中获取所有样本并将其传递给数组。 代码编译,但我似乎无法弄清楚在哪里传递文件所在的参数以及它的名称。 有帮助吗? PS如果这段代码完成它所说的那样,我认为它可能对很多人有用。 谢谢!

使用C创建立体声sin WAV

我试图在C中创建一个立体声正弦波WAV,可能有一个不同的(可能是空白的)左右声道。 使用此function为每个通道生成一个音调: int16_t * create_tone(float frequency, float amplitude, float duration) 然后我打开一个FILE*并调用create_wav 。 以下是我用来创建WAV的两个结构: struct wav_h { char ChunkID[4]; int32_t ChunkSize; char Format[4]; char Subchunk1ID[4]; int32_t Subchunk1Size; int16_t AudioFormat; int16_t NumChannels; int32_t SampleRate; int32_t ByteRate; int16_t BlockAlign; int16_t BitsPerSample; char Subchunk2ID[4]; int32_t Subchunk2Size; }; struct pcm_snd { int16_t channel_left; int16_t channel_right; }; 这是创建WAV文件的实际function: int create_wav_file(FILE* file, […]

如何在WAV文件数据上执行FFT?

我试图通过检测存在的最高频率来分析文件的音频质量(压缩音频通常会被过滤到低于20KHz的值)。 我正在使用soundstretch库中的类来读取WAV文件数据,该类将PCM样本作为浮点数返回,然后使用fftw3库对这些样本执行FFT。 然后对于每个频率(四舍五入到最接近的KHz),我总计该频率的幅度。 因此,对于不包含16KHz以上频率的低质量文件,我预计在16KHz以上没有振幅或振幅很小,但是我没有得到我期望的结果。 以下是我的代码: #include #include #include #include #include “include/WavFile.h” using namespace std; using namespace soundtouch; #define BUFF_SIZE 6720 #define MAX_FREQ 22//KHz static float freqMagnitude[MAX_FREQ]; static void calculateFrequencies(fftw_complex *data, size_t len, int Fs) { for (int i = 0; i < len; i++) { int re, im; float freq, magnitude; int index; re = […]

在c中打印wav标题

嗨,我有这个代码,用于输入一个wav文件,然后将wah头放入一个结构,然后输出它。 一切都很好除了audioFormat和numChannels但我无法理解为什么。例如它应该输出audioFormat:1和numChannels:2但它输出audioFormat:0和numChannels:1。 我不明白为什么会这样。 typedef struct wavHeader { byte chunckID[4]; dword chunckSize; byte format[4]; byte subchunk1ID[4]; word subchunk1Size; word audioFormat; word numChannels; dword sampleRate; dword byteRate; word blockAlign; word bitsPerSample; byte subchunk2ID[4]; dword subchunk2Size; }wav_header; int check_file_name(char *filename); void list(char **array) //argv { wav_header wavHeader; FILE *pFile; if(check_file_name(array[2]) == 0) { printf(“wrong file name\n”); exit(1); } […]

将PCM 16bit LE转换为WAV

我正在尝试用C编写一个程序,将捕获的Raw 16kHz PCM 16位文件转换为16位WAV 。 我已经阅读了一些post和推荐使用libsox 。 安装它,现在我真的很难理解man-page 。 到目前为止(通过阅读源dist中的示例)我已经找到了structs : sox_format_t sox_signalinfo_t 可能可以用来描述我正在输入的数据。 如果有必要,我也知道我正在处理多少信息(时间)? 一些指导表示赞赏!

将WAV转换为MP3时音频速度会发生变化

我创建了一个WAV ( PCM )到MP3转换器。 但输出太快了。 这是转换编码的代码。 FILE *pcm = fopen(in_path, “rb”); FILE *mp3 = fopen(out_path, “wb”); int read, write; const int PCM_SIZE = 8192; const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init(); lame_set_in_samplerate(lame, sampleRate); lame_set_brate(lame, byteRate); lame_set_num_channels(lame, channels); lame_set_mode(lame, MONO); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { read = fread(pcm_buffer, […]

使用C创建立体声WAV文件

我正在寻找用C创建一个WAV file ,并在这里看到了一个例子。 这看起来不错,但我有兴趣添加两个缓冲区来制作音频立体声(每个耳朵可能有不同的声音) 。 如果我将通道数设置为2,则音频仅从左通道播放(显然是正确的,因为左声道是第一个通道)。 我已经读过我必须将它与正确的频道交错。 不幸的是,我没有找到很多在线帮助创建立体声WAV。 write_little_endian((unsigned int)(data[i]),bytes_per_sample, wav_file); 我试图创建第二个缓冲区,振幅减半,看看我是否可以交错。 for (j=0; i<BUF_SIZE; i++) { phase +=freq_radians_per_sample; buffertwo[i] = (int)((amplitude/2) * sin(phase));; } write_wav("test.wav", BUF_SIZE, buffer, buffertwo, S_RATE); (更改函数以获取两个短整数缓冲区) 而且只是做 write_little_endian((unsigned int)(data[i]),bytes_per_sample, wav_file); write_little_endian((unsigned int)(datatwo[i]),bytes_per_sample, wav_file); 但这不起作用。 理论上这应该是交错的。

使用C处理音频wav文件

我正在处理wav文件的幅度并按一些小数因子缩放它。 我试图以有效记忆的方式阅读和重写文件,同时也试图解决语言的细微差别(我是C的新手)。 该文件可以是8位或16位格式。 我想这样做的方法是首先将标题数据读入一些预定义的结构,然后在循环中处理实际数据,我将把一大块数据读入缓冲区,做任何需要的事情,然后将其写入输出。 #include #include typedef struct header { char chunk_id[4]; int chunk_size; char format[4]; char subchunk1_id[4]; int subchunk1_size; short int audio_format; short int num_channels; int sample_rate; int byte_rate; short int block_align; short int bits_per_sample; short int extra_param_size; char subchunk2_id[4]; int subchunk2_size; } header; typedef struct header* header_p; void scale_wav_file(char * input, float factor, […]

WAV文件分析C(libsndfile,fftw3)

我正在尝试开发一个简单的C应用程序,它可以在WAV文件中的给定时间戳下在特定频率范围内给出0-100的值。 示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围分成n个范围(从0开始)。 然后我需要得到每个范围的幅度,从0到100。 到目前为止我管理的内容: 使用libsndfile我现在能够读取WAV文件的数据。 infile = sf_open(argv [1], SFM_READ, &sfinfo); float samples[sfinfo.frames]; sf_read_float(infile, samples, 1); 但是,我对FFT的理解相当有限。 但我知道为了使振幅达到我需要的范围是必需的。 但是我该如何继续前进呢? 我找到了FFTW-3库,它似乎适用于此目的。 我在这里找到了一些帮助: https : //stackoverflow.com/a/4371627/1141483 并在这里查看了FFTW教程: http ://www.fftw.org/fftw2_doc/fftw_2.html 但由于我不确定FFTW的行为,我不知道从这里开始。 另一个问题,假设你使用libsndfile:如果强制读取单引导(使用立体声文件)然后读取样本。 那么你真的只会阅读整个文件的一半样本吗? 其中一半来自频道1,还是自动过滤出来? 非常感谢你的帮助。 编辑:我的代码可以在这里看到: double blackman_harris(int n, int N){ double a0, a1, a2, a3, seg1, seg2, seg3, w_n; a0 = 0.35875; a1 = 0.48829; a2 = […]