使用c. 中的低通过滤器过滤.wav文件



我有一个任务来创建一个C程序,打开a.w wav文件,使用低通或高通滤波器过滤音频文件,并将结果保存在另一个文件中。现在,我只是打开了.wav文件,并显示了文件头中的所有信息。有人能帮我为文件创建一个过滤器吗?

下面是我的代码:

wave.c

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wave.h"
int main()
{
FILE *fp = NULL;
FILE *outfile = fopen("filtered.wav", "wb");

Wav wav;
RIFF_t riff;
FMT_t fmt;
Data_t data;

fp = fopen("sample.wav", "rb");
if (!fp) {
printf("can't open audio filen");
exit(1);
}

fread(&wav, 1, sizeof(wav), fp);

riff = wav.riff;
fmt = wav.fmt;
data = wav.data;

printf("ChunkID t%c%c%c%cn", riff.ChunkID[0], riff.ChunkID[1], riff.ChunkID[2], riff.ChunkID[3]);
printf("ChunkSize t%dn", riff.ChunkSize);
printf("Format tt%c%c%c%cn", riff.Format[0], riff.Format[1], riff.Format[2], riff.Format[3]);

printf("n");

printf("Subchunk1ID t%c%c%c%cn", fmt.Subchunk1ID[0], fmt.Subchunk1ID[1], fmt.Subchunk1ID[2], fmt.Subchunk1ID[3]);
printf("Subchunk1Size t%dn", fmt.Subchunk1Size);
printf("AudioFormat t%dn", fmt.AudioFormat);
printf("NumChannels t%dn", fmt.NumChannels);
printf("SampleRate t%dn", fmt.SampleRate);
printf("ByteRate t%dn", fmt.ByteRate);
printf("BlockAlign t%dn", fmt.BlockAlign);
printf("BitsPerSample t%dn", fmt.BitsPerSample);

printf("n");

printf("blockID t%c%c%c%cn", data.Subchunk2ID[0], data.Subchunk2ID[1], data.Subchunk2ID[2], data.Subchunk2ID[3]);
printf("blockSize t%dn", data.Subchunk2Size);

printf("n");

printf("duration t%dn", data.Subchunk2Size / fmt.ByteRate);
}

wave.h

typedef struct WAV_RIFF {
/* chunk "riff" */
char ChunkID[4];   /* "RIFF" */
/* sub-chunk-size */
uint32_t ChunkSize; /* 36 + Subchunk2Size */
/* sub-chunk-data */
char Format[4];    /* "WAVE" */
} RIFF_t;
typedef struct WAV_FMT {
/* sub-chunk "fmt" */
char Subchunk1ID[4];   /* "fmt " */
/* sub-chunk-size */
uint32_t Subchunk1Size; /* 16 for PCM */
/* sub-chunk-data */
uint16_t AudioFormat;   /* PCM = 1*/
uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */
uint32_t SampleRate;    /* 8000, 44100, etc. */
uint32_t ByteRate;  /* = SampleRate * NumChannels * BitsPerSample/8 */
uint16_t BlockAlign;    /* = NumChannels * BitsPerSample/8 */
uint16_t BitsPerSample; /* 8bits, 16bits, etc. */
} FMT_t;
typedef struct WAV_data {
/* sub-chunk "data" */
char Subchunk2ID[4];   /* "data" */
/* sub-chunk-size */
uint32_t Subchunk2Size; /* data size */
/* sub-chunk-data */
/* Data_block_t block; */
} Data_t;
/* typedef struct WAV_data_block {
} Data_block_t; */
typedef struct WAV_fotmat {
RIFF_t riff;
FMT_t fmt;
Data_t data;
} Wav;

所以我试图打开文件,将其存储在一个缓冲区中,并使用最简单的低通过滤器的公式过滤它,并存储在另一个缓冲区中。如何在输出文件中写入输出缓冲区?

int nb;
int buffIn[1024];
int buffOut[1024];
fread( buffIn, sizeof(char), 100, fp);
//I read all data in a buffer, copy the first 44 bytes(header) and filtered the rest of it
int i;
for (i = 0; i < sizeof(buffIn); ++i)
{
if(i < 44){
buffOut[i] = buffIn[i];
}else{
buffOut[i] = buffIn[i] + buffIn[i-1];
printf("0x%02x",buffOut[x]);
printf("t");
};
}

我想出了以下代码,但我不知道我做错了什么:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wave.h"
int main()
{
FILE *fp = NULL;
FILE *outfile = NULL;

Wav wav;
RIFF_t riff;
FMT_t fmt;
Data_t data;

fp = fopen("3sec.wav", "rb");
outfile = fopen("filtered.wav", "wb");
if(!fp) {
printf("can't open audio filen");
exit(1);
}

fread(&wav, 1, sizeof(wav), fp);
riff = wav.riff;
fmt = wav.fmt;
data = wav.data;

printf("ChunkID t%c%c%c%cn", riff.ChunkID[0], riff.ChunkID[1], riff.ChunkID[2], riff.ChunkID[3]);
printf("ChunkSize t%dn", riff.ChunkSize);
printf("Format tt%c%c%c%cn", riff.Format[0], riff.Format[1], riff.Format[2], riff.Format[3]);

printf("n");

printf("Subchunk1ID t%c%c%c%cn", fmt.Subchunk1ID[0], fmt.Subchunk1ID[1], fmt.Subchunk1ID[2], fmt.Subchunk1ID[3]);
printf("Subchunk1Size t%dn", fmt.Subchunk1Size);
printf("AudioFormat t%dn", fmt.AudioFormat);
printf("NumChannels t%dn", fmt.NumChannels);
printf("SampleRate t%dn", fmt.SampleRate);
printf("ByteRate t%dn", fmt.ByteRate);
printf("BlockAlign t%dn", fmt.BlockAlign);
printf("BitsPerSample t%dn", fmt.BitsPerSample);

printf("n");

printf("blockID t%c%c%c%cn", data.Subchunk2ID[0], data.Subchunk2ID[1], data.Subchunk2ID[2], data.Subchunk2ID[3]);
printf("blockSize t%dn", data.Subchunk2Size);

printf("n");

printf("duration t%dn", data.Subchunk2Size / fmt.ByteRate);
int nb;
int buffIn[1024];
int buffOut[1024];
fread( buffIn, sizeof(char), 1, fp);
//I read all data in a buffer, copy the first 44 bytes(header) and filtered the rest of it
int i;
for (i = 0; i < sizeof(buffIn); ++i)
{
if(i < 44){
buffOut[i] = buffIn[i];
}else{
buffOut[i] = buffIn[i] + buffIn[i-1];
printf("0x%02x",buffOut[i]);
printf("t");
};
}
fwrite(buffOut , 1 , sizeof(char) , outfile );
}