Enregistrer et filtrer un audio sous java
Résolu/Fermé
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
-
19 sept. 2011 à 17:59
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 sept. 2011 à 16:59
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 sept. 2011 à 16:59
A voir également:
- Java audio recorder
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Realtek audio driver - Télécharger - Pilotes & Matériel
- Java apk - Télécharger - Langages
- Apowersoft screen recorder - Télécharger - Capture d'écran
10 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
19 sept. 2011 à 18:08
19 sept. 2011 à 18:08
Rajoute une ligne dans ton main :
System.out.println(file.getAbsolutPath());
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 09:19
20 sept. 2011 à 09:19
Je le trouve toujours pas, le chemin est affiché dans la console mais le fichier audio n'existe pas dans le dossier spécifié ! :(
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 10:00
20 sept. 2011 à 10:00
Voici le code original, avec ta ligne de code System.out.println(file.getAbsolutePath)
package com.javasrc.audio;
import javax.sound.sampled.*;
import java.io.File;
/**
* Sample audio recorder
*/
public class Recorder extends Thread
{
/**
* The TargetDataLine that we'll use to read data from
*/
private TargetDataLine line;
/**
* The audio format type that we'll encode the audio data with
*/
private AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
/**
* The AudioInputStream that we'll read the audio data from
*/
private AudioInputStream inputStream;
/**
* The file that we're going to write data out to
*/
//static File file=new File("Test.wav");
private static File file;
/**
* Creates a new Audio Recorder
*/
public Recorder( String outputFilename )
{
try
{
// Create an AudioFormat that specifies how the recording will be performed
// In this example we'll 44.1Khz, 16-bit, stereo
AudioFormat audioFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, // Encoding technique
44100.0F, // Sample Rate
16, // Number of bits in each channel
2, // Number of channels (2=stereo)
4, // Number of bytes in each frame
44100.0F, // Number of frames per second
false ); // Big-endian (true) or little-
// endian (false)
// Create our TargetDataLine that will be used to read audio data by first
// creating a DataLine instance for our audio format type
DataLine.Info info = new DataLine.Info( TargetDataLine.class, audioFormat );
// Next we ask the AudioSystem to retrieve a line that matches the
// DataLine Info
this.line = ( TargetDataLine )AudioSystem.getLine( info );
// Open the TargetDataLine with the specified format
this.line.open( audioFormat );
// Create an AudioInputStream that we can use to read from the line
this.inputStream = new AudioInputStream( this.line );
// Create the output file
this.file = new File( outputFilename );
}
catch( Exception e )
{
e.printStackTrace();
}
}
public void startRecording()
{
// Start the TargetDataLine
this.line.start();
// Start our thread
start();
}
public void stopRecording()
{
// Stop and close the TargetDataLine
this.line.stop();
this.line.close();
}
public void run()
{
try
{
// Ask the AudioSystem class to write audio data from the audio input stream
// to our file in the specified data type (PCM 44.1Khz, 16-bit, stereo)
AudioSystem.write( this.inputStream, this.targetType, this.file );
}
catch( Exception e )
{
e.printStackTrace();
}
}
public static void main( String[] args )
{
if( args.length == 0 )
{
System.out.println( "Usage: Recorder <filename>" );
System.out.println(file.getAbsoluteFile());
System.exit( 0 );
}
try
{
// Create a recorder that writes WAVE data to the specified filename
Recorder r = new Recorder( args[ 0 ] );
System.out.println( "Press ENTER to start recording" );
System.in.read();
// Start the recorder
r.startRecording();
System.out.println( "Press ENTER to stop recording" );
System.in.read();
// Stop the recorder
r.stopRecording();
System.out.println( "Recording complete" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
Et voila ce que j'ai comme erreur :
Usage: Recorder <filename>
Exception in thread "main" java.lang.NullPointerException
at com.javasrc.audio.Recorder.main(Recorder.java:115)
Merci a tous
package com.javasrc.audio;
import javax.sound.sampled.*;
import java.io.File;
/**
* Sample audio recorder
*/
public class Recorder extends Thread
{
/**
* The TargetDataLine that we'll use to read data from
*/
private TargetDataLine line;
/**
* The audio format type that we'll encode the audio data with
*/
private AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
/**
* The AudioInputStream that we'll read the audio data from
*/
private AudioInputStream inputStream;
/**
* The file that we're going to write data out to
*/
//static File file=new File("Test.wav");
private static File file;
/**
* Creates a new Audio Recorder
*/
public Recorder( String outputFilename )
{
try
{
// Create an AudioFormat that specifies how the recording will be performed
// In this example we'll 44.1Khz, 16-bit, stereo
AudioFormat audioFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, // Encoding technique
44100.0F, // Sample Rate
16, // Number of bits in each channel
2, // Number of channels (2=stereo)
4, // Number of bytes in each frame
44100.0F, // Number of frames per second
false ); // Big-endian (true) or little-
// endian (false)
// Create our TargetDataLine that will be used to read audio data by first
// creating a DataLine instance for our audio format type
DataLine.Info info = new DataLine.Info( TargetDataLine.class, audioFormat );
// Next we ask the AudioSystem to retrieve a line that matches the
// DataLine Info
this.line = ( TargetDataLine )AudioSystem.getLine( info );
// Open the TargetDataLine with the specified format
this.line.open( audioFormat );
// Create an AudioInputStream that we can use to read from the line
this.inputStream = new AudioInputStream( this.line );
// Create the output file
this.file = new File( outputFilename );
}
catch( Exception e )
{
e.printStackTrace();
}
}
public void startRecording()
{
// Start the TargetDataLine
this.line.start();
// Start our thread
start();
}
public void stopRecording()
{
// Stop and close the TargetDataLine
this.line.stop();
this.line.close();
}
public void run()
{
try
{
// Ask the AudioSystem class to write audio data from the audio input stream
// to our file in the specified data type (PCM 44.1Khz, 16-bit, stereo)
AudioSystem.write( this.inputStream, this.targetType, this.file );
}
catch( Exception e )
{
e.printStackTrace();
}
}
public static void main( String[] args )
{
if( args.length == 0 )
{
System.out.println( "Usage: Recorder <filename>" );
System.out.println(file.getAbsoluteFile());
System.exit( 0 );
}
try
{
// Create a recorder that writes WAVE data to the specified filename
Recorder r = new Recorder( args[ 0 ] );
System.out.println( "Press ENTER to start recording" );
System.in.read();
// Start the recorder
r.startRecording();
System.out.println( "Press ENTER to stop recording" );
System.in.read();
// Stop the recorder
r.stopRecording();
System.out.println( "Recording complete" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
Et voila ce que j'ai comme erreur :
Usage: Recorder <filename>
Exception in thread "main" java.lang.NullPointerException
at com.javasrc.audio.Recorder.main(Recorder.java:115)
Merci a tous
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 20/09/2011 à 11:00
Modifié par KX le 20/09/2011 à 11:00
Dans le premier code tu avais File file = new File("Test.wav"); et c'est le chemin absolu de ce fichier que je te demandais d'afficher (l est décrit par un chemin relatif et ce que tu veux c'est le chemin absolu)
Or dans ce deuxième code tu fais File file; et tu ne l'initialises que bien plus tard dans le code, au moment du new Recorder(args[0]). Donc si ça plante c'est parce qu'au moment où tu affiches son chemin, file vaut null ! Ce qu'il te faut afficher c'est finalement new File(args[0]).getAbsolutPath(); ou alors mais ça revient normalement au même, faire l'affichage après le new Recorder(args[0])
Or dans ce deuxième code tu fais File file; et tu ne l'initialises que bien plus tard dans le code, au moment du new Recorder(args[0]). Donc si ça plante c'est parce qu'au moment où tu affiches son chemin, file vaut null ! Ce qu'il te faut afficher c'est finalement new File(args[0]).getAbsolutPath(); ou alors mais ça revient normalement au même, faire l'affichage après le new Recorder(args[0])
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 12:03
20 sept. 2011 à 12:03
Merci pour tes explication, mais tu a raison ça revient au même.
J'ai essayé tout et j'ai toujours cette erreur au moment de l'exécution de mon programme, et le fichier son ne pourra pas être enregistré, et le problème c'est que je vois pas ou est l'erreur dans mon code.
quand j'ajoute System.out.println(file.getAbsolutPath());ou new File(args[0]).getAbsolutPath(); dans mon main c'est une erreur d'exception qu'il me renvoi et quand je les retire le programme exécute et le fichier son n'est nul part :('
Je vais m'y mettre a nouveau
@ +
J'ai essayé tout et j'ai toujours cette erreur au moment de l'exécution de mon programme, et le fichier son ne pourra pas être enregistré, et le problème c'est que je vois pas ou est l'erreur dans mon code.
quand j'ajoute System.out.println(file.getAbsolutPath());ou new File(args[0]).getAbsolutPath(); dans mon main c'est une erreur d'exception qu'il me renvoi et quand je les retire le programme exécute et le fichier son n'est nul part :('
Je vais m'y mettre a nouveau
@ +
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 12:25
20 sept. 2011 à 12:25
Donne directement à args[0] un chemin absolu (D:\\Test.wav par exemple) chez moi le fichier Test.wav est alors bien enregistré dans D:\
Mais chez moi ce code fonctionne pour savoir où est le chemin des anciens fichiers enregistré :
Mais chez moi ce code fonctionne pour savoir où est le chemin des anciens fichiers enregistré :
System.out.println( "Recording complete" ); System.out.println(file.getAbsolutePath());
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 12:42
20 sept. 2011 à 12:42
STP u peux me donner la ligne du code ou t'a modifié le args[0] à D:\\Test.wav (ce que tu a modifié toi )
ça fait 3 jours que je travailles sur ce code :) et je voudrais bien voir mon résultat :)
Merci
ça fait 3 jours que je travailles sur ce code :) et je voudrais bien voir mon résultat :)
Merci
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 12:47
20 sept. 2011 à 12:47
En fait ce n'est pas dans le code, c'est quand tu lances ton programme. En premier argument tu donnes directement un chemin absolu :
java Recorder D:\test.wav
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 12:54
20 sept. 2011 à 12:54
Quand je lance mon programme voila ce qui m'affiche dans la console :
Usage: Recorder <filename>
C:\Users\workspace\Reco_Vocale\Test.wav
Mais quand j'y vais a ce dossier je trouve rien.
tu peux me dire il t'affiche quoi le programme quand tu le lance chez toi, et comment tu arrive a lui donner en premier argument un chemin absolu!?
Merci beaucoup
Usage: Recorder <filename>
C:\Users\workspace\Reco_Vocale\Test.wav
Mais quand j'y vais a ce dossier je trouve rien.
tu peux me dire il t'affiche quoi le programme quand tu le lance chez toi, et comment tu arrive a lui donner en premier argument un chemin absolu!?
Merci beaucoup
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 13:01
20 sept. 2011 à 13:01
Le problème c'est que tu ne passes pas d'arguments à ton programme !!!
Du coup tu rentres dans le cas if (args.length==0) qui arrete le programme.
Tu dois passer le nom de ton fichier en argument de ton programme comme je l'ai mis plus haut !
Du coup tu rentres dans le cas if (args.length==0) qui arrete le programme.
Tu dois passer le nom de ton fichier en argument de ton programme comme je l'ai mis plus haut !
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 13:20
20 sept. 2011 à 13:20
Voici ton code, légèrement remanié, de sorte que tu ne devrais plus avoir de problème :
import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.util.Scanner; /** Sample audio recorder */ public class Recorder extends Thread { /** The TargetDataLine that we'll use to read data from */ private final TargetDataLine line; /** The audio format type that we'll encode the audio data with */ private final AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE; /** The AudioInputStream that we'll read the audio data from */ private final AudioInputStream inputStream; /** The file that we're going to write data out to */ private File file; /** * Creates a new Audio Recorder * @param outputFilename * @throws LineUnavailableException */ public Recorder(String outputFilename) throws LineUnavailableException { // Create an AudioFormat that specifies how the recording will be performed // In this example we'll 44.1Khz, 16-bit, stereo AudioFormat audioFormat = new AudioFormat ( AudioFormat.Encoding.PCM_SIGNED, // Encoding technique 44100.0F, // Sample Rate 16, // Number of bits in each channel 2, // Number of channels (2=stereo) 4, // Number of bytes in each frame 44100.0F, // Number of frames per second false // Big-endian (true) or little-endian (false) ); // Create our TargetDataLine that will be used to read audio data by first // creating a DataLine instance for our audio format type DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); // Next we ask the AudioSystem to retrieve a line that matches the // DataLine Info line = (TargetDataLine) AudioSystem.getLine(info); // Open the TargetDataLine with the specified format line.open(audioFormat); // Create an AudioInputStream that we can use to read from the line inputStream = new AudioInputStream(line); // Create the output file file = new File(outputFilename); } public void startRecording() { // Start the TargetDataLine line.start(); // Start our thread start(); } public void stopRecording() { // Stop and close the TargetDataLine line.stop(); line.close(); } public void run() { // Ask the AudioSystem class to write audio data from the audio input stream // to our file in the specified data type (PCM 44.1Khz, 16-bit, stereo) try { AudioSystem.write(inputStream,targetType,file); } catch (IOException e) { e.printStackTrace(); } } public String getPath() { return file.getAbsolutePath(); } public static void pressEnter(String text) { System.out.println(text); new Scanner(System.in).nextLine(); } public static void main(String...args) { // Setting fileName String fileName = "default.wav"; // default; if(args.length == 0) System.out.println("Usage: java Recorder <filename>\n" + "Default file will be used\n"); else fileName = args[0]; try { // Create a recorder that writes WAVE data to the specified filename Recorder r = new Recorder(fileName); // Start the recorder pressEnter("Press ENTER to start recording"); r.startRecording(); // Stop the recorder pressEnter("Press ENTER to stop recording"); r.stopRecording(); System.out.println("Recording complete : "+r.getPath()); } catch (LineUnavailableException e) { e.printStackTrace(); } } }
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 14:05
20 sept. 2011 à 14:05
c'est résolu !!!! Merci beaucoup pour ton aide !!!
Greg_Greg
Messages postés
8
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
20 septembre 2011
20 sept. 2011 à 14:52
20 sept. 2011 à 14:52
Enfin pas tout à fait fini !!! il reste a faire passer ce fichier son via filtre passe bande que j'ai déjà posté au début ! tout sera posté à la fin de ce programme.
je le fait pour apprendre et les autres puissent en profiter!
@plus
je le fait pour apprendre et les autres puissent en profiter!
@plus
pour filtrer le son passé via un micro j'ai fait une petite recherche et je suis tombé sur cet article http://membres.multimania.fr/amycoders/tutorials/maverick/sfftm.html qui propose un filtre en java
double i1, i2, o1, o2; /* temporary variables */
double a0, a1, a2; /* coefficients */
double b0, b1, b2; /* coefficients */
double f; /* last Frequency used */
double q; /* last Q used */
double g; /* last Gain used */
long t; /* last Type used */
static int maxfilterunits=10;
double FilterCell(long Unit, double Input, double Frequency, double Q, double Gain, int Type)
{
/* --------------------------------------------------------------- */
double Output=0,S,omega,A,sn,cs,alpha,beta,temp1,temp2,temp3,temp4;
/* -- check if frequency, Q, gain or type has changed.. and, if so, update coefficients */
if ( ( Frequency != f ) || ( Q != q ) || ( Gain != g ) || ( Type != t ) ) {
f = Frequency; q = Q; g = Gain; t = Type; /* remember last frequency, q, gain and type */
switch (Type) {
case 0: /* no filtering */
b0 = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
break;
case 1: /* lowpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b1 = ( 1.0 - cs ) * a0 * Gain;
b0 = b1 * 0.5;
break;
case 2: /* highpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b1 = -( 1.0 + cs ) * a0 * Gain;
b0 = -b1 * 0.5;
break;
case 3: /* bandpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn =Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b0 = alpha * a0 * Gain;
break;
case 4: /* notch */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b0 = a0 * Gain;
b1 = a1 * Gain;
break;
case 5: /* lowshelf */
/* "shelf slope" 1.0 = max slope, because neither Q nor bandwidth is used in */
/* those filters (note: true only for lowshelf and highshelf, not peaking). */
S = 1.0; /* used only by lowshelf and highshelf */
A = Math.pow( 10.0 , ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
temp1 = A + 1.0; temp2 = A - 1.0; temp3 = temp1 * cs; temp4 = temp2 * cs;
beta = sn * Math.sqrt( ( A * A + 1.0 ) / S - temp2 * temp2 );
a0 = 1.0 / ( temp1 + temp4 + beta );
a1 = ( -2.0 * ( temp2 + temp3 ) ) * a0;
a2 = ( temp1 + temp4 - beta ) * a0;
b0 = ( A * ( temp1 - temp4 + beta ) ) * a0;
b1 = ( 2.0 * A * ( temp2 - temp3 ) ) * a0;
b2 = ( A * ( temp1 - temp4 - beta ) ) * a0;
break;
case 6: /* highshelf */
/* "shelf slope" 1.0 = max slope, because neither Q nor bandwidth is used in */
/* those filters (note: true only for lowshelf and highshelf, not peaking). */
S = 1.0; /* used only by lowshelf and highshelf */
A = Math.pow( 10.0, ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
temp1 = A + 1.0; temp2 = A - 1.0; temp3 = temp1 * cs; temp4 = temp2 * cs;
beta = sn * Math.sqrt( ( A * A + 1.0 ) / S - temp2 * temp2 );
a0 = 1.0 / ( temp1 - temp4 + beta );
a1 = ( 2.0 * ( temp2 - temp3 ) ) * a0;
a2 = ( temp1 - temp4 - beta ) * a0;
b0 = ( A * ( temp1 + temp4 + beta ) ) * a0;
b1 = ( -2.0 * A * ( temp2 + temp3 ) ) * a0;
b2 = ( A * ( temp1 + temp4 - beta ) ) * a0;
break;
case 7: /* peaking */
A = Math.pow( 10.0, ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
temp1 = alpha * A;
temp2 = alpha / A;
a0 = 1.0 / ( 1.0 + temp2 );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - temp2 ) * a0;
b0 = ( 1.0 + temp1 ) * a0;
b2 = ( 1.0 - temp1 ) * a0;
break;
}
}
/* -- filter loop: if you don't change the parameters of the filter dynamically, ~only this code will be executed. */
switch (Type) {
case 0: /* no filtering */
Output = b0*Input;
Output = Input;
break;
case 1: /* lowpass */
case 2: /* highpass */
Output = b0*Input + b1*i1 + b0*i2 - a1*o1 - a2*o2;
break;
case 3: /* bandpass */
Output = b0*Input - b0*i2 - a1*o1 - a2*o2;
break;
case 4: /* notch */
Output = b0*Input + b1*i1 + b0*i2 - a1*o1 - a2*o2;
break;
case 5: /* low shelving */
case 6: /* high shelving */
Output = b0*Input + b1*i1 + b2*i2 - a1*o1 - a2*o2;
break;
case 7: /* peaking */
Output = b0*Input + a1*i1 + b2*i2 - a1*o1 - a2*o2;
break;
}
o2=o1; o1=Output; i2=i1; i1=Input; /* update variables for recursion */
return(Output);
}
}
mais je sais pas trop comment l'utiliser et l'anglais n'est pas trop mon truc !
Si on finit le boulot ?! :) :) :) !
Je sais pas trop si c'est faisable déjà :( !
Merci
double i1, i2, o1, o2; /* temporary variables */
double a0, a1, a2; /* coefficients */
double b0, b1, b2; /* coefficients */
double f; /* last Frequency used */
double q; /* last Q used */
double g; /* last Gain used */
long t; /* last Type used */
static int maxfilterunits=10;
double FilterCell(long Unit, double Input, double Frequency, double Q, double Gain, int Type)
{
/* --------------------------------------------------------------- */
double Output=0,S,omega,A,sn,cs,alpha,beta,temp1,temp2,temp3,temp4;
/* -- check if frequency, Q, gain or type has changed.. and, if so, update coefficients */
if ( ( Frequency != f ) || ( Q != q ) || ( Gain != g ) || ( Type != t ) ) {
f = Frequency; q = Q; g = Gain; t = Type; /* remember last frequency, q, gain and type */
switch (Type) {
case 0: /* no filtering */
b0 = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
break;
case 1: /* lowpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b1 = ( 1.0 - cs ) * a0 * Gain;
b0 = b1 * 0.5;
break;
case 2: /* highpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b1 = -( 1.0 + cs ) * a0 * Gain;
b0 = -b1 * 0.5;
break;
case 3: /* bandpass */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn =Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b0 = alpha * a0 * Gain;
break;
case 4: /* notch */
Gain = Math.pow( 10.0, Gain / 20.0 ); /* convert from dB to linear */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
a0 = 1.0 / ( 1.0 + alpha );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - alpha ) * a0;
b0 = a0 * Gain;
b1 = a1 * Gain;
break;
case 5: /* lowshelf */
/* "shelf slope" 1.0 = max slope, because neither Q nor bandwidth is used in */
/* those filters (note: true only for lowshelf and highshelf, not peaking). */
S = 1.0; /* used only by lowshelf and highshelf */
A = Math.pow( 10.0 , ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
temp1 = A + 1.0; temp2 = A - 1.0; temp3 = temp1 * cs; temp4 = temp2 * cs;
beta = sn * Math.sqrt( ( A * A + 1.0 ) / S - temp2 * temp2 );
a0 = 1.0 / ( temp1 + temp4 + beta );
a1 = ( -2.0 * ( temp2 + temp3 ) ) * a0;
a2 = ( temp1 + temp4 - beta ) * a0;
b0 = ( A * ( temp1 - temp4 + beta ) ) * a0;
b1 = ( 2.0 * A * ( temp2 - temp3 ) ) * a0;
b2 = ( A * ( temp1 - temp4 - beta ) ) * a0;
break;
case 6: /* highshelf */
/* "shelf slope" 1.0 = max slope, because neither Q nor bandwidth is used in */
/* those filters (note: true only for lowshelf and highshelf, not peaking). */
S = 1.0; /* used only by lowshelf and highshelf */
A = Math.pow( 10.0, ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
temp1 = A + 1.0; temp2 = A - 1.0; temp3 = temp1 * cs; temp4 = temp2 * cs;
beta = sn * Math.sqrt( ( A * A + 1.0 ) / S - temp2 * temp2 );
a0 = 1.0 / ( temp1 - temp4 + beta );
a1 = ( 2.0 * ( temp2 - temp3 ) ) * a0;
a2 = ( temp1 - temp4 - beta ) * a0;
b0 = ( A * ( temp1 + temp4 + beta ) ) * a0;
b1 = ( -2.0 * A * ( temp2 + temp3 ) ) * a0;
b2 = ( A * ( temp1 + temp4 - beta ) ) * a0;
break;
case 7: /* peaking */
A = Math.pow( 10.0, ( Gain / 40.0 ) ); /* Gain is expressed in dB */
omega = ( Math.PI*2 * Frequency ) / 44100;
sn = Math.sin( omega ); cs = Math.cos( omega );
alpha = sn / ( 2.0 * Q );
temp1 = alpha * A;
temp2 = alpha / A;
a0 = 1.0 / ( 1.0 + temp2 );
a1 = ( -2.0 * cs ) * a0;
a2 = ( 1.0 - temp2 ) * a0;
b0 = ( 1.0 + temp1 ) * a0;
b2 = ( 1.0 - temp1 ) * a0;
break;
}
}
/* -- filter loop: if you don't change the parameters of the filter dynamically, ~only this code will be executed. */
switch (Type) {
case 0: /* no filtering */
Output = b0*Input;
Output = Input;
break;
case 1: /* lowpass */
case 2: /* highpass */
Output = b0*Input + b1*i1 + b0*i2 - a1*o1 - a2*o2;
break;
case 3: /* bandpass */
Output = b0*Input - b0*i2 - a1*o1 - a2*o2;
break;
case 4: /* notch */
Output = b0*Input + b1*i1 + b0*i2 - a1*o1 - a2*o2;
break;
case 5: /* low shelving */
case 6: /* high shelving */
Output = b0*Input + b1*i1 + b2*i2 - a1*o1 - a2*o2;
break;
case 7: /* peaking */
Output = b0*Input + a1*i1 + b2*i2 - a1*o1 - a2*o2;
break;
}
o2=o1; o1=Output; i2=i1; i1=Input; /* update variables for recursion */
return(Output);
}
}
mais je sais pas trop comment l'utiliser et l'anglais n'est pas trop mon truc !
Si on finit le boulot ?! :) :) :) !
Je sais pas trop si c'est faisable déjà :( !
Merci
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 16:19
20 sept. 2011 à 16:19
Le code que tu as récupéré n'est pas du code Java !
Alors il serait bon de te demander ce que tu souhaites faire, car les bibliothèques Java font déjà peut-être ce que tu veux sans avoir à reprendre ce code que tu ne sais toi même pas trop ce qu'il fait ou comment t'en servir !
Alors il serait bon de te demander ce que tu souhaites faire, car les bibliothèques Java font déjà peut-être ce que tu veux sans avoir à reprendre ce code que tu ne sais toi même pas trop ce qu'il fait ou comment t'en servir !
Un peu d'explication !!! dans le genre "un signal audio est composé de sons à différentes fréquences, je veux éliminer tous les sons qui ont des fréquences inférieures à 5kHz ou supérieures à 15kHz" (par exemple)
je veux filtrer mon son pour avoir une bonne qualité d'enregistrement ! et si y a des bibliothèques java qui font ça ça sera mieux que de reprendre ce code !
pour ceux qui s'intéressent au traitement de signal et au filtrage sonore je vous conseilles de voir ce lien ( en anglais bien évidemment) http://membres.multimania.fr/amycoders/tutorials/maverick/sfftm.html
je veux filtrer mon son pour avoir une bonne qualité d'enregistrement ! et si y a des bibliothèques java qui font ça ça sera mieux que de reprendre ce code !
pour ceux qui s'intéressent au traitement de signal et au filtrage sonore je vous conseilles de voir ce lien ( en anglais bien évidemment) http://membres.multimania.fr/amycoders/tutorials/maverick/sfftm.html
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
20 sept. 2011 à 16:59
20 sept. 2011 à 16:59
Moi perso je n'arrive pas à tester, mais comme j'ai pas de micro ceci explique surement cela ^^
Pour avoir des exemples de code, le mieux c'est regarder sur le site officiel Java Sound Demo et de potasser le code source des parties qui t'intéressent...
Pour avoir des exemples de code, le mieux c'est regarder sur le site officiel Java Sound Demo et de potasser le code source des parties qui t'intéressent...