examples.be.tarsos.dsp.example.GoertzelDTMF Maven / Gradle / Ivy
The newest version!
/*
* _______ _____ _____ _____
* |__ __| | __ \ / ____| __ \
* | | __ _ _ __ ___ ___ ___| | | | (___ | |__) |
* | |/ _` | '__/ __|/ _ \/ __| | | |\___ \| ___/
* | | (_| | | \__ \ (_) \__ \ |__| |____) | |
* |_|\__,_|_| |___/\___/|___/_____/|_____/|_|
*
* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*
* -------------------------------------------------------------
*
* Info: http://0110.be/tag/TarsosDSP
* Github: https://github.com/JorenSix/TarsosDSP
* Releases: http://0110.be/releases/TarsosDSP/
*
* TarsosDSP includes modified source code by various authors,
* for credits and info, see README.
*
*/
package be.tarsos.dsp.example;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.ByteArrayInputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioProcessor;
import be.tarsos.dsp.io.TarsosDSPAudioFloatConverter;
import be.tarsos.dsp.io.TarsosDSPAudioInputStream;
import be.tarsos.dsp.io.jvm.AudioPlayer;
import be.tarsos.dsp.io.jvm.JVMAudioInputStream;
import be.tarsos.dsp.pitch.DTMF;
import be.tarsos.dsp.pitch.Goertzel;
import be.tarsos.dsp.pitch.Goertzel.FrequenciesDetectedHandler;
/**
* An example of DTMF ( Dual-tone multi-frequency signaling ) decoding with the Goertzel algorithm.
* @author Joren Six
*/
public class GoertzelDTMF extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = -1143769091770146361L;
private KeyAdapter keyAdapter = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
if(DTMF.isDTMFCharacter(event.getKeyChar())){
try {
process(event.getKeyChar());
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
private final int stepSize = 256;
private final AudioProcessor goertzelAudioProcessor = new Goertzel(44100, stepSize,DTMF.DTMF_FREQUENCIES, new FrequenciesDetectedHandler() {
@Override
public void handleDetectedFrequencies(double time,final double[] frequencies, final double[] powers, final double[] allFrequencies, final double allPowers[]) {
if (frequencies.length == 2) {
int rowIndex = -1;
int colIndex = -1;
for (int i = 0; i < 4; i++) {
if (frequencies[0] == DTMF.DTMF_FREQUENCIES[i] || frequencies[1] == DTMF.DTMF_FREQUENCIES[i])
rowIndex = i;
}
for (int i = 4; i < DTMF.DTMF_FREQUENCIES.length; i++) {
if (frequencies[0] == DTMF.DTMF_FREQUENCIES[i] || frequencies[1] == DTMF.DTMF_FREQUENCIES[i])
colIndex = i-4;
}
if(rowIndex>=0 && colIndex>=0){
detectedChar.setText(""+DTMF.DTMF_CHARACTERS[rowIndex][colIndex]);
for (int i = 0; i < allPowers.length; i++) {
powerBars[i].setValue((int) allPowers[i]);
}
}
}
}
});
private final JProgressBar[] powerBars;
private final JLabel detectedChar = new JLabel(" ");
public GoertzelDTMF(){
this.getContentPane().setLayout(new BorderLayout(5,3));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Goertzel");
JPanel detectionPanel = new JPanel(new GridLayout(DTMF.DTMF_FREQUENCIES.length,2,5,3));
powerBars = new JProgressBar[DTMF.DTMF_FREQUENCIES.length];
for(int i= 0 ; i < DTMF.DTMF_FREQUENCIES.length ; i++){
detectionPanel.add(new JLabel(DTMF.DTMF_FREQUENCIES[i] + "Hz"));
powerBars[i] = new JProgressBar(-30,50);
detectionPanel.add(powerBars[i]);
powerBars[i].setValue(-30);
}
detectionPanel.setBorder(new TitledBorder("Detected Powers"));
JPanel labelPanel = new JPanel(new BorderLayout());
labelPanel.add(detectionPanel,BorderLayout.NORTH);
detectedChar.setBorder(new TitledBorder("Detected character"));
detectedChar.setHorizontalAlignment(JLabel.CENTER);
Font f = new Font("Police", Font.PLAIN, 20);
detectedChar.setFont(f);
labelPanel.add(detectedChar,BorderLayout.CENTER);
JPanel dailPad = new JPanel(new GridLayout(4,4));
dailPad.setBorder(new TitledBorder("DailPad"));
for(int row = 0 ; row < DTMF.DTMF_CHARACTERS.length ; row++){
for(int col = 0 ; col < DTMF.DTMF_CHARACTERS[row].length ; col++){
JButton numberButton = new JButton(DTMF.DTMF_CHARACTERS[row][col]+"");
numberButton.addActionListener(this);
numberButton.addKeyListener(keyAdapter);
dailPad.add(numberButton);
}
}
this.addKeyListener(keyAdapter);
dailPad.addKeyListener(keyAdapter);
this.add(dailPad,BorderLayout.CENTER);
this.add(labelPanel,BorderLayout.SOUTH);
}
public static void main(String...strings){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
//ignore failure to set default look & feel;
}
JFrame frame = new GoertzelDTMF();
frame.pack();
frame.setSize(200,420);
frame.setVisible(true);
}
});
}
@Override
public void actionPerformed(ActionEvent event) {
JButton button = ((JButton) event.getSource());
//System.out.println(button.getText().charAt(0));
try {
process(button.getText().charAt(0));
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Process a DTMF character: generate sound and decode the sound.
* @param character The character.
* @throws UnsupportedAudioFileException
* @throws LineUnavailableException
*/
public void process(char character) throws UnsupportedAudioFileException, LineUnavailableException{
final float[] floatBuffer = DTMF.generateDTMFTone(character);
final AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
JVMAudioInputStream.toTarsosDSPFormat(format);
final TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(JVMAudioInputStream.toTarsosDSPFormat(format));
final byte[] byteBuffer = new byte[floatBuffer.length * format.getFrameSize()];
converter.toByteArray(floatBuffer, byteBuffer);
final ByteArrayInputStream bais = new ByteArrayInputStream(byteBuffer);
final AudioInputStream inputStream = new AudioInputStream(bais, format,floatBuffer.length);
final TarsosDSPAudioInputStream stream = new JVMAudioInputStream(inputStream);
final AudioDispatcher dispatcher = new AudioDispatcher(stream, stepSize, 0);
dispatcher.addAudioProcessor(goertzelAudioProcessor);
dispatcher.addAudioProcessor(new AudioPlayer(format));
new Thread(dispatcher).start();
}
}