⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procesamientosenhal.java

📁 This is a example about programming a neural network
💻 JAVA
字号:
/*
 * ProcesamientoSenhal.java
 *
 * Created on 17 de enero de 2008, 12:56 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package rah;

/**
 *
 * @author JhonFranko
 */
import java.awt.*;
import java.util.*;

public class ProcesamientoSenhal
{
    
    /** Creates a new instance of ProcesamientoSenhal */
    private double[] datosVoz;
    private double[] newDatosVoz=null;    
    private int ancho;
    private fft senhal;
    private double[][] vAux;
    private double[][] vFactor; 
    
    public ProcesamientoSenhal(double[] dxVoz,int ancho)
    {
        this.datosVoz=dxVoz;
        this.ancho=ancho;
        
    }
    public double promedio(double[] x,int n,int inicio,int razon)
    {
       double p=0;
       int cont=inicio;
       
      for(int i=0;i<n;i++)
      {
         if(cont<x.length && cont>0)   
         {
          p=p+Math.abs(x[cont]);           
          cont=cont+razon;

        } 
      }      
       p=p/(double)n;
       return p;
    }
   public double obtener_Umbral(double[] x,int r,int n)
    {
      double umbral=0;
      double ValorI=0,ValorF=0;
      int cont=n;
      int c=0;
      
      ValorI=0;
      for(int i=0;i<r;i++)
      {
         ValorI=ValorI+ Math.abs(x[c]);
         c=c+cont;
      }
      ValorI=ValorI/(double)r;
      ValorF=0;
      c=cont;
      for(int i=0;i<r;i++)
      {
         ValorF=ValorF+ Math.abs(x[x.length-c]);
         c=c+cont;         
      }      
      
      ValorF=ValorF/(double)r;      
      umbral=((ValorI+ValorF)/2.0)+n;
              
      return umbral;    
    }

    public double[] Sel_Elim_Seg_Inservibles(int radio,int n)
    {

          int umbral=(int)obtener_Umbral(datosVoz,radio,n);          
          System.out.println("UMBRAL 1"+umbral);          
         
          
          int Inicio=0,Fin=0;
          int cont=2;
          for(int i=n;i<datosVoz.length-n;i=i+n)
          {
              if((int)promedio(datosVoz,cont,i,-n)>umbral)
              {
                  System.out.println("PROMEDIO 1 "+promedio(datosVoz,cont,i,-n));
                 Inicio=i;
                 i=datosVoz.length;
              }
              cont++;
          }  
          cont=2;
          for(int i=datosVoz.length-(n+2);i>0;i=i-n)
          {
              if((int)promedio(datosVoz,cont,i,n)>umbral)
              {
                  System.out.println("PROMEDIO 2 "+promedio(datosVoz,cont,i,n));                  
                 Fin=i;
                 i=0;
              }
              cont++;              
          }         
          //-------------------------------------------
          //Llenado de datos de nuevo vector
           System.out.println("Inicio "+Inicio+ " Fin "+ Fin);
          int t=(Fin-Inicio)+1;
          newDatosVoz=new double[t];           
          int c=0;
          for(int i=Inicio;i<=Fin;i++)
          {
              newDatosVoz[c]=datosVoz[i];
              c++;
          }  
          System.out.println("Nuevos Datos "+newDatosVoz.length);
          return newDatosVoz;
    }
    
     public void setDxVoz(double[] dxVoz)
    {
        this.datosVoz=dxVoz;
    }    
    
//******************************************************************************************
// Operaciones estadisticas     

    public static double media(double arr[ ])
    {
        double sum = 0.0;

        for(int i = 0; i < arr.length ; i++)
        {
            sum += arr[i];
        }

        return sum / arr.length;
    }    
    
    public static double varianza(double arr[ ], double media)
    {
        double sum = 0.0;

        for(int i = 0; i < arr.length ; i++)
        {
            sum += Math.pow(arr[i] - media, 2);
        }
        
        return sum / (arr.length - 1);
    }
//******************************************************************************************    
     public double[] rescatarPicos(double[] x, double umbral){
         
         double[] xa=new double[x.length];
         double[] xb=new double[x.length];
         double[] xc=new double[x.length];
         
         for(int i=0;i<x.length;i++){
             
             xa[i]=Math.abs(x[i]);
             
             if(xa[i] > umbral){
                 
                 xb[i]=1.0;
             }
             else{
                 
                 xb[i]=0.0;
             }             
             xc[i]= xb[i] * (xa[i] - umbral);
          }  
         return xc;
     }
     
     public double[] cuboPicos(double[] x){
         
         double[] xa=new double[x.length];         
         double[] xc=new double[x.length];
         
         for(int i=0;i<x.length;i++){
             
             xa[i]=2 * x[i];
             xc[i]= Math.pow(xa[i],3);
          }  
         return xc;
     }
     
     public double[][] obtPicos(double[] x){
         
         double[][] localMagnitud=new double[x.length][2];
         int j=0;
         
         for(int i=2;i<x.length-1;i++){
             
             if( x[i]>=x[i-1]  && x[i]>=x[i+1]  &&  x[i]!=x[i+1]){
             
                localMagnitud[j][0]=i;
                localMagnitud[j][1]=x[i];
                j++;
             }    
          }  
         
         double[][] localAux=new double[j][2];
         
         for(int i=0; i<j; i++){
             
             localAux[i][0]=localMagnitud[i][0];
             localAux[i][1]=localMagnitud[i][1];
         }
         
         return localAux;
     }
     
    public double[] convolucion(double [] A,double [] B){
        
	   int t=A.length+B.length-1;	   	
	   double[] c=new double[t];		
				
			for(int i=0; i<A.length; i++)
			{
			    for(int j=0; j<B.length; j++)
			    {
			    	c[i+j] += A[i]*B[j];
			    }	
			}	
            return c;
     }
        
    public double maximo(double[]x){
        
        double max=0.0;
        
        max=x[0];
        
        for(int j=1; j<x.length; j++){
            
            if(x[j]>max){
                
                max=x[j];
            }
        }	
        return max;
    }
    public double[] actualizarVectorDistancias(double[] d)
    {

       double[] dTemp=new double[d.length];
       int j=0;
       
         for(int i=0;i<d.length;i++){                        
             if(d[i]> 0)       
             {
                 dTemp[j]=d[i];             
                 j++;             
             }
         }
       double[] daux=new double[j];
       
         for(int i=0;i<j;i++){                       
                 daux[i]=dTemp[i];             
         }       
       return daux;
    }    
    
     public double obtencionPitch(){
         
         // DATOS DE ENTRADA FUNDAMENTAL
         double[] x=datosVoz;
         double fs=datosVoz.length;
         
         
         double p=0.0, umbral=0.0;
         double[] xc1=new double[x.length];         
         double[] xc2=new double[x.length];         

         xc1=cuboPicos(x);
         umbral=maximo(xc1) * 0.4;
         xc2=rescatarPicos(xc1,umbral);
         
         double[] mediaP={0.05,0.1,0.2,0.3,0.2,0.1,0.05};

         double[] mSuavisado=null; 
         double[][] localMagnitud=null;

         mSuavisado=convolucion(xc2,mediaP);
         localMagnitud=obtPicos(mSuavisado);
         double[] d=new double[localMagnitud.length];            
         
       //Calculo las distancias entre cada par de picos sucesivos  
         for (int i = 0;i<localMagnitud.length-1;i++ )                          
             d[i] = localMagnitud[i+1][0] - localMagnitud[i][0];
        
        //Obtengo el promedio y la desviacion estandar
        double dm = media(d);            
        double ds = Math.sqrt(varianza(d,dm));         
        
        //Desechamos aquellos datos que entre la distancia conrrespecto a su media sean mayores
        //a la desviacion standar
        
         double[] check=new double[d.length];
         double[] dnew=new double[d.length];
         
         for(int i=0;i<d.length;i++){             
             if(Math.abs(d[i]-dm)< ds)                 
                 check[i]=1.0;             
             else                 
                 check[i]=0.0;             
         }
        // Recalculando las distancias entre picos con respecto a aquellos
         // que han sido removidos
         for(int i=0;i<check.length-1;i++){        

            if(check[i]==0 && d[i]<dm)
            {         
              d[i+1]=d[i]+d[i+1];
              i++;
            } 
            else{
               if(check[i]==0 )
               {
                 dnew[i]=Math.round(0.5*d[i]);
               }
               else
               {
                 dnew[i]=d[i];
               }
            }             
         }              
        // El vector de nuevas distancias sera todo a quel que sea mayor que cero
          
          double[] dnew2=null;
         
         dnew2=actualizarVectorDistancias(dnew);
         
         double pitchPeriod=media(dnew2);
         
         p=fs/pitchPeriod;
         
         return p;
     }
 //***************************************************************************************    
 //---------------------------------------------------------------------------------------
 //---------------------------------------------------------------------------------------
 // Tranformada de Fourier
    public double[] obtenerFFT(double[] DxVoz)
    {
      double[] vFFT=null;
      senhal= new fft(DxVoz);
      
            senhal.validarVector();
            vAux=senhal.getVectorValido();
            //senhal.mostrarVector(vAux);
            senhal.fftDiezmado();
            vAux=senhal.getVectorValido();
            //senhal.mostrarVector(vAux);
            senhal.ordenarVector(vAux);
            vFFT=senhal.obtenerVectorSalida();      
      
      return vFFT;    
    }
     
     
     
 // ALGORITMOS DE PROC DIGITAL DEL HABLA
   public double[] filtro_PreEnfasis(double[] dxVoz,double alfa)
   {
     double[] y=new double[dxVoz.length];
             
           y[0]=dxVoz[0];
           
            for(int i=0;i<dxVoz.length-2;i++)
            {
              y[i+1]=dxVoz[i+1]-(alfa*dxVoz[i]);
            }         
      
     return y;
   }
     
   //**************************************************************************************
   // Transformada Corta de Fourier
    public double[] ventanamiento(double[] ventana,double factorAlfa)
    {
          for(int i=0;i<ventana.length;i++)
          {
              int m=ventana.length;
              //hanning o hamming
              ventana[i]=ventana[i]*((1-factorAlfa)-(factorAlfa*(Math.cos((2*Math.PI*(m-i))/m))));
              
          }
      
      return ventana;
    }
    public double[] obtenerTFCF(double[] dxVoz,int longVent,int desp)
    {
      double[] vTFCF=new double[dxVoz.length];
      int i,j,contTFCF=0;
      for (i=0;i<dxVoz.length-(desp+longVent);i+=desp)
      {
          //Obtengo ventana
          double[] ventana=new double[longVent];
          int k=0;
          for(j=i;j<i+longVent;j++)
          {
              ventana[k]=dxVoz[j];
              k++;
          }
          //Calculo FFT de la ventana
          double[] ventana2=ventanamiento(ventana,0.46);
          double[] FFT_Vent=obtenerFFT(ventana2); 
       
          //Utilizo solo la mitad del vector  FFT_Vent         
          int c=contTFCF;
          k=0;
          for(j=c;j<c+longVent/2;j++)
          {
              vTFCF[j]=FFT_Vent[k];
              //System.out.println("Vector TFCF en "+j+"= "+vTFCF[j]);
              k++;
          }          
          contTFCF+=longVent/2;
      }      
      
      return vTFCF;    
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -