#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
//Declaración de Constantes
const long MAXMUE = 500000;
const unsigned short MAXCAD= 20;
const unsigned short MAXMEMIIR=2; //Coloco el numero de elementos
const unsigned short MAXCOEFIIR=3;
//Declaración de Estructura de Datos
typedef char TCadena[MAXCAD];
struct TCabWAV{
char RIFF[4];
int tamano;
char WAVE [4];
char fmt [4];
int tamfmt;
short fmtPCM;
short nCanales;
int mueseg;
int bytSeg;
short bytBlq;
short bytMue;
char DATA [4];
int bytData;
};
typedef short TInfo;
typedef float TCoef;
typedef TCoef TMemoriaFiltIIR[MAXMEMIIR];
typedef TCoef TCoefFiltIIR[MAXCOEFIIR];
typedef TInfo TVectorMuestras[MAXMUE];
struct TFileWAV{
TCabWAV cab;
TVectorMuestras datos;
};
//Declaración de Cabeceras de Procedimientos
void LeerFichWave(fstream &mfi, TFileWAV &wave);
void EscribirFichWave(fstream &mfo, TFileWAV &waveout);
void VisualizarCab(const TCabWAV cab);
void InicializacionMemFiltIIR(TMemoriaFiltIIR &mem_in,TMemoriaFiltIIR &mem_out);
void FiltradoIIR(TFileWAV &wave, TFileWAV &wave_out, TMemoriaFiltIIR &mem_in, TMemoriaFiltIIR &mem_out, TCoefFiltIIR &coef_A, TCoefFiltIIR &coef_B);
int main()
{
cout<<"empieza el main.."<<endl;
TCadena nombreout,nombreoutB1, nombreoutB2, nombreoutB3;
TFileWAV wave,waveout,wave_outB1,wave_outB2,wave_outB3;
fstream mfi, mfo,mfoB1, mfoB2, mfoB3;
long i, tamano;
float muestra;
TMemoriaFiltIIR mem_inB1,mem_outB1,mem_inB2,mem_outB2,mem_inB3,mem _outB3;
TCoefFiltIIR coefB1_A, coefB1_B, coefB2_A, coefB2_B, coefB3_A, coefB3_B;
//Abro y Creo el fichero de salida
cout<<"-------- SOFTWARE CRD POR BANDAS ----------"<<endl;
mfi.open("sultans.wav", ios::in |ios::binary);
if(!mfi.is_open()) {
cout<<"Error al abrir el fichero"<<endl;
}else{
cout<<"Por favor, inserte nombre de fichero que desea crear: ";
cin>>nombreout;
mfo.open(nombreout, ios::out|ios::binary);
cout<<"Por favor, inserte nombre de fichero que desea crear Banda1: ";
cin>>nombreoutB1;
mfoB1.open(nombreoutB1, ios::out|ios::binary);
cout<<"Por favor, inserte nombre de fichero que desea crear Banda2: ";
cin>>nombreoutB2;
mfoB2.open(nombreoutB2, ios::out|ios::binary);
cout<<"Por favor, inserte nombre de fichero que desea crear Banda3: ";
cin>>nombreoutB3;
mfoB3.open(nombreoutB3, ios::out|ios::binary);
}
//Leo Fichero de Entrada
LeerFichWave(mfi, wave);
//Visualizo Cabecera
VisualizarCab(wave.cab);
//Inicialización Constantes
InicializacionMemFiltIIR(mem_inB1,mem_outB1);
InicializacionMemFiltIIR(mem_inB2,mem_outB2);
InicializacionMemFiltIIR(mem_inB3,mem_outB3);
coefB1_A[0]=1 ;coefB1_A[1]=-1.9288 ;coefB1_A[2]=0.9313 ; coefB1_B[0]=0.0006 ;coefB1_B[1]=0.0012 ;coefB1_B[2]=0.0006;
coefB2_A[0]=1 ;coefB2_A[1]=-1.6833 ;coefB2_A[2]=0.7006 ; coefB2_B[0]=0.1497 ;coefB2_B[1]=0 ;coefB2_B[2]=-0.1497 ;
coefB3_A[0]=1 ;coefB3_A[1]=-1.4458 ;coefB3_A[2]=0.5690 ; coefB3_B[0]=0.7537 ;coefB3_B[1]=-1.5074 ;coefB3_B[2]=0.7537 ;
//Filtrado IIR 3 Bandas
wave_outB1.cab=wave.cab;
wave_outB2.cab=wave.cab;
wave_outB3.cab=wave.cab;
void FiltradoIIR(TFileWAV &wave, TFileWAV &wave_outB1, TMemoriaFiltIIR &mem_inB1, TMemoriaFiltIIR &mem_outB1, TCoefFiltIIR &coefB1_A, TCoefFiltIIR &coefB1_B);
void FiltradoIIR(TFileWAV &wave, TFileWAV &wave_outB2, TMemoriaFiltIIR &mem_inB2, TMemoriaFiltIIR &mem_outB2, TCoefFiltIIR &coefB2_A, TCoefFiltIIR &coefB2_B);
void FiltradoIIR(TFileWAV &wave, TFileWAV &wave_outB3, TMemoriaFiltIIR &mem_inB3, TMemoriaFiltIIR &mem_outB3, TCoefFiltIIR &coefB3_A, TCoefFiltIIR &coefB3_B);
//Proceso
waveout.cab=wave.cab;
tamano=wave.cab.bytData/2;
for(i=0;i<tamano;i++){
muestra=float(wave_outB1.datos[i]+wave_outB2.datos[i]+wave_outB3.datos[i]);
waveout.datos[i]=short(muestra);
}
//Escribo Fichero de Salida
EscribirFichWave(mfo, waveout);
EscribirFichWave(mfoB1, wave_outB1);
EscribirFichWave(mfoB2, wave_outB2);
EscribirFichWave(mfoB3, wave_outB3);
mfi.close();
mfo.close();
mfoB1.close();
mfoB2.close();
mfoB3.close();
return 0;
}
//Procedimientos Utilizados
void LeerFichWave(fstream &mfi, TFileWAV &wave){
long i,tamano;
TInfo datos;
mfi.read((char *)&wave.cab, sizeof(TCabWAV));
tamano=wave.cab.bytData/2;
for (i=0;i<tamano;i++){
mfi.read((char *)&datos, sizeof(TInfo));
wave.datos[i]=datos;
}
}
void EscribirFichWave( fstream &mfo, TFileWAV &waveout){
long i,tamano;
TInfo dato;
mfo.write((char *)&waveout.cab, sizeof(TCabWAV));
tamano=waveout.cab.bytData/2;
for(i=0;i<tamano;i++){
dato=waveout.datos[i];
mfo.write((char *)&dato, sizeof(TInfo));
}
}
void FiltradoIIR(TFileWAV &wave, TFileWAV &wave_out, TMemoriaFiltIIR &mem_in, TMemoriaFiltIIR &mem_out, TCoefFiltIIR &coef_A, TCoefFiltIIR &coef_B){
long i, tamano;
float muestra_in,muestra_out;
//wave_out.cab=wave.cab;
tamano=wave.cab.bytData/2;
for (i=0;i<tamano;i++){
muestra_in=float(wave.datos[i]);
muestra_out=muestra_in*coef_B[0]+mem_in[0]*coef_B[1]+mem_in[1]*coef_B[2]-mem_out[0]*coef_A[1]-mem_out[1]*coef_A[2];
wave_out.datos[i]=short(muestra_out);
if (i==0){
mem_in[1]=0.0;
mem_out[1]=0.0;
}else{
mem_in[1]=mem_in[0];
mem_out[1]=mem_out[0];
}
mem_in[0]=muestra_in;
mem_out[0]=muestra_out;
}
}
void InicializacionMemFiltIIR(TMemoriaFiltIIR &mem_in,TMemoriaFiltIIR &mem_out){
mem_in[0]=0.0;
mem_in[1]=0.0;
mem_out[0]=0.0;
mem_out[1]=0.0;
}
void VisualizarCab(const TCabWAV cab){
cout<<"CABECERA DEL FICHERO WAV"<<endl;
cout<<endl;
cout<<"Identificador RIFF: "<<cab.RIFF<<endl;
cout<<"Tamano fichero: "<<cab.tamano<<endl;
cout<<"Identificador WAVE: "<<cab.WAVE<<endl;
cout<<"Identificador del formato fmt: "<<cab.fmt<<endl;
cout<<"Tamano del bloque de formato: "<<cab.tamfmt<<endl;
cout<<"Formato PCM: "<<cab.fmtPCM<<endl;
cout<<"Numero de Canales: "<<cab.nCanales<<endl;
cout<<"Muestra por segundo: "<<cab.mueseg<<endl;
cout<<"Bytes por segundo: "<<cab.bytSeg<<endl;
cout<<"Bytes por bloque: "<<cab.bytBlq<<endl;
cout<<"Bytes por muestra: "<<cab.bytMue<<endl;
cout<<"Data: "<<cab.DATA<<endl;
cout<<"Numero de bytes de datos: "<<cab.bytData<<endl;
}