/** * Copyright 2007 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.sinusoidal.hntm.analysis; import java.io.DataInputStream; import java.io.DataOutput; import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; import marytts.signalproc.sinusoidal.BaseSinusoidalSpeechFrame; /** * @author oytun.turk * */ public class HntmSpeechFrame extends BaseSinusoidalSpeechFrame { public FrameHarmonicPart h; // Harmonics component (lower frequencies which are less than maximum frequency of voicing) public FrameNoisePart n; // Noise component (upper frequencies) public float f0InHz; public float maximumFrequencyOfVoicingInHz; // If 0.0, then the frame is unvoiced public float tAnalysisInSeconds; // Current analysis instant (middle of window) in seconds public float deltaAnalysisTimeInSeconds; // Difference between middle of next analysis frame and current analysis frame in // seconds public HntmSpeechFrame() { this(0.0f); } public HntmSpeechFrame(float f0InHzIn) { h = null; n = null; f0InHz = f0InHzIn; maximumFrequencyOfVoicingInHz = 0.0f; tAnalysisInSeconds = -1.0f; deltaAnalysisTimeInSeconds = 0.0f; } public HntmSpeechFrame(HntmSpeechFrame existing) { this(); if (existing != null) { if (existing.h != null) h = new FrameHarmonicPart(existing.h); if (existing.n != null) { if (existing.n instanceof FrameNoisePartLpc) n = new FrameNoisePartLpc((FrameNoisePartLpc) existing.n); else if (existing.n instanceof FrameNoisePartPseudoHarmonic) n = new FrameNoisePartPseudoHarmonic((FrameNoisePartPseudoHarmonic) existing.n); else if (existing.n instanceof FrameNoisePartWaveform) n = new FrameNoisePartWaveform((FrameNoisePartWaveform) existing.n); f0InHz = existing.f0InHz; maximumFrequencyOfVoicingInHz = existing.maximumFrequencyOfVoicingInHz; tAnalysisInSeconds = existing.tAnalysisInSeconds; deltaAnalysisTimeInSeconds = existing.deltaAnalysisTimeInSeconds; } } } public HntmSpeechFrame(DataInputStream dis, int noiseModel) throws IOException, EOFException { this(); f0InHz = dis.readFloat(); maximumFrequencyOfVoicingInHz = dis.readFloat(); tAnalysisInSeconds = dis.readFloat(); deltaAnalysisTimeInSeconds = dis.readFloat(); int numHarmonics = dis.readInt(); if (numHarmonics > 0) h = new FrameHarmonicPart(dis, numHarmonics); int vectorSize = dis.readInt(); if (noiseModel == HntmAnalyzerParams.LPC) { n = new FrameNoisePartLpc(dis, vectorSize); if (((FrameNoisePartLpc) n).lpCoeffs == null) n = null; } else if (noiseModel == HntmAnalyzerParams.PSEUDO_HARMONIC) { n = new FrameNoisePartPseudoHarmonic(dis, vectorSize); if (((FrameNoisePartPseudoHarmonic) n).ceps == null) n = null; } else if (noiseModel == HntmAnalyzerParams.WAVEFORM) { n = new FrameNoisePartWaveform(dis, vectorSize); if (((FrameNoisePartWaveform) n).waveform == null) n = null; } } public HntmSpeechFrame(ByteBuffer bb, int noiseModel) throws IOException, EOFException { this(); f0InHz = bb.getFloat(); maximumFrequencyOfVoicingInHz = bb.getFloat(); tAnalysisInSeconds = bb.getFloat(); deltaAnalysisTimeInSeconds = bb.getFloat(); int numHarmonics = bb.getInt(); if (numHarmonics > 0) h = new FrameHarmonicPart(bb, numHarmonics); int vectorSize = bb.getInt(); if (noiseModel == HntmAnalyzerParams.LPC) { n = new FrameNoisePartLpc(bb, vectorSize); if (((FrameNoisePartLpc) n).lpCoeffs == null) n = null; } else if (noiseModel == HntmAnalyzerParams.PSEUDO_HARMONIC) { n = new FrameNoisePartPseudoHarmonic(bb, vectorSize); if (((FrameNoisePartPseudoHarmonic) n).ceps == null) n = null; } else if (noiseModel == HntmAnalyzerParams.WAVEFORM) { n = new FrameNoisePartWaveform(bb, vectorSize); if (((FrameNoisePartWaveform) n).waveform == null) n = null; } } public void write(DataOutput out) throws IOException { out.writeFloat(f0InHz); out.writeFloat(maximumFrequencyOfVoicingInHz); out.writeFloat(tAnalysisInSeconds); out.writeFloat(deltaAnalysisTimeInSeconds); int numHarmonics = 0; if (h != null && h.complexAmps != null) numHarmonics = h.complexAmps.length; out.writeInt(numHarmonics); if (h != null) h.write(out); int vectorSize = 0; if (n != null) vectorSize = n.getVectorSize(); out.writeInt(vectorSize); if (n != null) n.write(out); } public boolean equals(HntmSpeechFrame other) { if (!h.equals(other.h)) return false; if (!n.equals(other.n)) return false; if (f0InHz != other.f0InHz) return false; if (maximumFrequencyOfVoicingInHz != other.maximumFrequencyOfVoicingInHz) return false; if (tAnalysisInSeconds != other.tAnalysisInSeconds) return false; if (deltaAnalysisTimeInSeconds != other.deltaAnalysisTimeInSeconds) return false; return true; } // Returns the size of this object in bytes public int getLength() { int len = 4 * (4 + 1 + 1); if (h != null) len += h.getLength(); if (n != null) len += n.getLength(); return len; } }