All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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();
		
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy