/** * Copyright 2004-2006 DFKI GmbH. * All Rights Reserved. Use is subject to license terms. * * This file is part of MARY TTS. * * MARY TTS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package marytts.signalproc.analysis; import java.io.File; import java.io.FileReader; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import marytts.signalproc.Defaults; import marytts.signalproc.analysis.FrameBasedAnalyser.FrameAnalysisResult; import marytts.signalproc.analysis.LpcAnalyser.LpCoeffs; import marytts.util.data.DoubleDataSource; import marytts.util.data.audio.AudioDoubleDataSource; import marytts.util.data.text.ESTTextfileDoubleDataSource; /** * * A Pitch-synchronous LPC analyser. * * @author Marc Schröder * */ public class LpcPitchSynchronousAnalyser extends PitchFrameAnalyser { public static int lpOrder = 0; /** * Initialise a PitchLPCAnalyser. * * @param signal * the signal source to read from * @param pitchmarks * the source of the pitchmarks, in seconds from the start of signal * @param windowType * type of analysis window to use, @see{de.dfki.signalproc.window.Window#getAvailableTypes()} * @param samplingRate * the number of samples in one second. */ public LpcPitchSynchronousAnalyser(DoubleDataSource signal, DoubleDataSource pitchmarks, int windowType, int samplingRate) { super(signal, pitchmarks, windowType, samplingRate); } /** * Create a new PitchLPCAnalyser with a configurable number of pitch periods per frame and pitch periods to shift by. * * @param signal * audio signal * @param pitchmarks * an array of pitchmarks; each pitch mark is in seconds from signal start * @param windowType * type of analysis window to use, @see{de.dfki.signalproc.window.Window#getAvailableTypes()} * @param samplingRate * number of samples per second in signal * @param framePeriods * number of periods that each frame should contain * @param shiftPeriods * number of periods that frames should be shifted by */ public LpcPitchSynchronousAnalyser(DoubleDataSource signal, DoubleDataSource pitchmarks, int windowType, int samplingRate, int framePeriods, int shiftPeriods) { super(signal, pitchmarks, windowType, samplingRate, framePeriods, shiftPeriods); } /** * Apply this PitchFrameAnalyser to the given data. * * @param frame * the data to analyse, which must be of the length prescribed by this FrameBasedAnalyser, i.e. by * {@link #getFrameLengthSamples()}. * @return an LPCoeffs object representing the lpc coefficients and gain factor of the frame. * @throws IllegalArgumentException * if frame does not have the prescribed length */ public Object analyse(double[] frame) { // for assertion only: int expectedFrameLength = 0; for (int i = 0; i < periodLengths.length; i++) { expectedFrameLength += periodLengths[i]; } if (frame.length != expectedFrameLength) System.err.println("Expected frame of length " + expectedFrameLength + "(" + periodLengths.length + " periods)" + ", got " + frame.length); return LpcAnalyser.calcLPC(frame, lpOrder); } public static void main(String[] args) throws Exception { File audioFile = new File(args[0]); File pitchmarkFile = new File(args[1]); AudioInputStream ais = AudioSystem.getAudioInputStream(audioFile); int samplingRate = (int) ais.getFormat().getSampleRate(); DoubleDataSource signal = new AudioDoubleDataSource(ais); DoubleDataSource pitchmarks = new ESTTextfileDoubleDataSource(new FileReader(pitchmarkFile)); int windowType = Defaults.getWindowType(); int fftSize = Defaults.getFFTSize(); int p = Integer.getInteger("signalproc.lpcorder", 24).intValue(); LpcPitchSynchronousAnalyser pla = new LpcPitchSynchronousAnalyser(signal, pitchmarks, windowType, samplingRate, 2, 1); FrameAnalysisResult[] far = pla.analyseAllFrames(); for (int i = 0; i < far.length; i++) { LpCoeffs coeffs = (LpCoeffs) far[i].get(); System.out.print(far[i].getStartTime() + ": gain " + coeffs.getGain() + ", coffs: "); for (int j = 0; j < coeffs.getOrder(); j++) { System.out.print(coeffs.getA(j) + " "); } System.out.println(); } } }