Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include iostream>
- #include fstream>
- #include stdint.h>
- #include cstdlib>
- #include ctime>
- #include math.h>
- using namespace std;
- struct RIFFHeader
- {
- char chunkId[4]; // 4 byte character array
- uint32_t chunkSize; // 4 bytes
- char format[4]; // 4 byte array
- };
- struct FormatSubChunk
- {
- char chunkId[4];
- uint32_t chunkSize;
- uint16_t audioFormat;
- uint16_t channels;
- uint32_t frequency; //
- uint32_t byteRate; //
- uint16_t blockAlign;
- uint16_t bitsPerSample;
- };
- struct DataSubChunkHeader
- {
- char chunkId[4];
- uint32_t chunkSize; //
- };
- struct Sample
- {
- uint16_t leftchannel;
- uint16_t rightchannel;
- };
- double coeff_11025[17]={0.0011468,0.0051113,0.014364,0.030915,
- 0.054955,0.083795,0.11194,0.13262,0.14024,0.13262,0.11194,0.083795,
- 0.054955,0.030915,0.014364,0.0051113,0.0011468};
- double coeff_22050[25] = {0.00093276,0.0033739,0.0062125,0.011378,0.018027,
- 0.026654,0.036717,0.047821,0.059142,0.069811,0.078867,0.085459,0.08893,
- 0.085459,0.078867,0.069811,0.059142,0.047821,0.036717,0.026654,0.018027,
- 0.011378,0.0062125,0.0033739,0.00093276};
- void shiftArray22050(int16_t array[])
- {
- for(int i = 0; i < 24; i++)
- {
- array[i] = array[i+1];
- }
- }
- void shiftArray11025(int16_t array[])
- {
- for(int i = 0; i < 16; i++)
- {
- array[i] = array[i+1];
- }
- }
- int main()
- {
- clock_t start;
- double duration;
- start = clock();
- string infile = "Frederick_N_mod.wav";
- string outfile = "Frederick_N_lp.wav";
- ifstream in(infile.c_str(), ios::in | ios::binary);
- ofstream output(outfile.c_str());
- RIFFHeader RIFF;
- in.read((char*)&RIFF,sizeof(RIFF));
- FormatSubChunk Format;
- in.read((char*)&Format,sizeof(Format));
- DataSubChunkHeader Data;
- in.read((char*)&Data,sizeof(Data));
- cout << "Chunk ID: " << RIFF.chunkId[0] << RIFF.chunkId[1] << RIFF.chunkId[2] << RIFF.chunkId[3] << endl;
- cout << "Chunk Size: " << RIFF.chunkSize << endl;
- cout << "Format: " << RIFF.format[0] << RIFF.format[1] << RIFF.format[2] << RIFF.format[3] <<endl;
- cout << "Sub-chunk1 ID: " << Format.chunkId[0] << Format.chunkId[1] << Format.chunkId[2] << Format.chunkId[3] <<endl;
- cout << "Sub-chunk1 Size: " << Format.chunkSize << endl;
- cout << "Audio Format: " << Format.audioFormat << endl;
- cout << "Number of Channels: " << Format.channels << endl;
- cout << "Sample Rate: " << Format.frequency << endl;
- cout << "Byte Rate: " << Format.byteRate << endl;
- cout << "Block Align: " << Format.blockAlign << endl;
- cout << "Bits Per Sample: " << Format.bitsPerSample << endl;
- cout << "Sub-chunk2 ID: " << Data.chunkId[0] << Data.chunkId[1] << Data.chunkId[2] << Data.chunkId[3] << endl;
- cout << "Sub-chunk2 Size: " << Data.chunkSize << endl << endl;
- //uint16_t clear = 0;
- output.write((char*)&RIFF, sizeof(RIFF));
- output.write((char*)&Format, sizeof(Format));
- output.write((char*)&Data, sizeof(Data));
- int16_t leftSample;
- int16_t rightSample;
- double leftDouble = 0;
- double rightDouble = 0;
- int16_t leftFilter;
- int16_t rightFilter;
- int32_t count = 0;
- if(Format.frequency == 22050)
- {
- int16_t pastSamplesLeft[25] = {0};
- int16_t pastSamplesRight[25] = {0};
- while(!in.eof())
- {
- shiftArray22050(pastSamplesLeft);
- shiftArray22050(pastSamplesRight);
- in.read((char*)&leftSample, 2);
- pastSamplesLeft[24] = leftSample;
- if(in.eof())
- break;
- in.read((char*)&rightSample, 2);
- pastSamplesRight[24] = rightSample;
- if(in.eof())
- break;
- for(int i = 0; i < 25; i++)
- {
- leftDouble +=((double)pastSamplesLeft[i] * coeff_22050[i]);
- rightDouble += ((double)pastSamplesRight[i] * coeff_22050[i]);
- }
- leftFilter = (int16_t)leftDouble;
- rightFilter = (int16_t)rightDouble;
- output.write((char*)&leftFilter, sizeof(leftFilter));
- output.write((char*)&rightFilter, sizeof(rightFilter));
- leftDouble = 0;
- rightDouble = 0;
- leftFilter = 0;
- rightFilter = 0;
- count++;
- }
- }
- else if(Format.frequency == 11025)
- {
- int16_t pastSamplesLeft[17] = {0};
- int16_t pastSamplesRight[17] = {0};
- while(!in.eof())
- {
- shiftArray11025(pastSamplesLeft);
- shiftArray11025(pastSamplesRight);
- in.read((char*)&leftSample, 2);
- pastSamplesLeft[16] = leftSample;
- if(in.eof())
- break;
- in.read((char*)&rightSample, 2);
- pastSamplesRight[16] = rightSample;
- if(in.eof())
- break;
- for(int i = 0; i < 17; i++)
- {
- leftDouble = leftDouble + ((double)pastSamplesLeft[i] * coeff_11025[i]);
- rightDouble = rightDouble + ((double)pastSamplesRight[i] * coeff_11025[i]);
- }
- leftFilter = (int16_t)leftDouble;
- rightFilter = (int16_t)rightDouble;
- leftDouble = 0;
- rightDouble = 0;
- output.write((char*)&leftFilter, sizeof(leftFilter));
- output.write((char*)&rightFilter, sizeof(rightFilter));
- count++;
- }
- }
- else
- {
- cout << "Frequency not supported, please use a wav file with frequency 11025 or 22050" << endl;
- return 0;
- }
- in.close();
- output.close();
- string infile1 = "Frederick_N_lp.wav";
- ifstream in1(infile1.c_str(), ios::in | ios::binary);
- RIFFHeader riff1;
- in1.read((char*)&riff1,sizeof(riff1));
- FormatSubChunk format1;
- in1.read((char*)&format1,sizeof(format1));
- DataSubChunkHeader data1;
- in1.read((char*)&data1,sizeof(data1));
- in.close();
- cout << "Chunk ID: " << riff1.chunkId[0] << riff1.chunkId[1] << riff1.chunkId[2] << riff1.chunkId[3] << endl;
- cout << "Chunk Size: " << riff1.chunkSize << endl;
- cout << "Format: " << riff1.format[0] << riff1.format[1] << riff1.format[2] << riff1.format[3] <<endl;
- cout << "Sub-chunk1 ID: " << format1.chunkId[0] << format1.chunkId[1] << format1.chunkId[2] << format1.chunkId[3] <<endl;
- cout << "Sub-chunk1 Size: " << format1.chunkSize << endl;
- cout << "Audio Format: " << format1.audioFormat << endl;
- cout << "Number of Channels: " << format1.channels << endl;
- cout << "Sample Rate: " << format1.frequency << endl;
- cout << "Byte Rate: " << format1.byteRate << endl;
- cout << "Block Align: " << format1.blockAlign << endl;
- cout << "Bits Per Sample: " << format1.bitsPerSample << endl;
- cout << "Sub-chunk2 ID: " << data1.chunkId[0] << data1.chunkId[1] << data1.chunkId[2] << data1.chunkId[3] << endl;
- cout << "Sub-chunk2 Size: " << data1.chunkSize << endl << endl;
- //---------------------------------------------------------------------------------------------------------------------------------
- duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
- string sumoutfile = "summary_filter.txt";
- ofstream sumoutput(sumoutfile.c_str());
- sumoutput << "sampling frequency = " << Format.frequency << 'n';
- long recordTime = count/Format.frequency;
- sumoutput << "record time = " << recordTime << " seconds" << 'n';
- sumoutput << "execution time = " << duration << " seconds" << 'n';
- sumoutput.close();
- return 0;
- }
Add Comment
Please, Sign In to add comment