DoubleSineWaveSource.java

/*
 * $Id: SineWaveSource.java,v 1.7 2008/07/15 15:27:15 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 *
 */

package org.mklab.tool.control.system.source;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.system.parameter.Parameter;
import org.mklab.tool.control.system.parameter.SIunit;
import org.mklab.tool.control.system.parameter.StringExternalizable;


/**
 * 正弦波信号を発生するシステムを表すクラスです。
 * 
 * @author Koga Laboratory
 * @version $Revision: 1.7 $, 2005/06/15
 */

public class DoubleSineWaveSource extends DoubleContinuousSource implements StringExternalizable {

  /** 振幅のバイアス */
  @Parameter(name = "bias", description = "SineWaveSource.1", internationalization = true)
  private double bias = 0;
  /** 振幅 */
  @Parameter(name = "amplitude", description = "SineWaveSource.3", internationalization = true)
  private double amplitude = 1.0;
  /** 周波数 */
  @Parameter(name = "frequency", unit = {SIunit.rad, SIunit.s_1}, description = "SineWaveSource.5", internationalization = true)
  private double frequency = 1;
  /** 位相 */
  @Parameter(name = "phase", unit = SIunit.rad, description = "SineWaveSource.7", internationalization = true)
  private double phase = 0;

  /**
   * 新しく生成された<code>PulseSignalSource</code>オブジェクトを初期化します。
   * 
   * @param bias 振幅のバイアス
   * @param amplitude 振幅
   * @param frequency 周波数
   * @param phase 位相
   */
  public DoubleSineWaveSource(final double bias, final double amplitude, final double frequency, final double phase) {
    super(1);
    this.bias = bias;
    this.amplitude = amplitude;
    this.frequency = frequency;
    this.phase = phase;
  }

  /**
   * 新しく生成された<code>PulseSignalSource</code>オブジェクトを初期化します。
   * 
   * @param amplitude 振幅
   * @param frequency 周波数
   */
  public DoubleSineWaveSource(final double amplitude, final double frequency) {
    this(0, amplitude, frequency, 0);
  }

  /**
   * 新しく生成された<code>StepSignalSource</code>オブジェクトを初期化します。
   */
  public DoubleSineWaveSource() {
    this(1.0, 1);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public DoubleMatrix outputEquation(final double t) {
    final double y = this.amplitude * (Math.sin(this.frequency * t + this.phase)) + this.bias;
    return new DoubleMatrix(new double[] {y});
  }

  /**
   * 振幅のバイアスを設定します。
   * 
   * @param bias 振幅のバイアス
   */
  public void setBias(final double bias) {
    this.bias = bias;
  }

  /**
   * 振幅のバイアスを返します。
   * 
   * @return 振幅のバイアス
   */
  public double getBias() {
    return this.bias;
  }

  /**
   * 振幅を設定します。
   * 
   * @param amplitude 振幅
   */
  public void setAmplitude(final double amplitude) {
    this.amplitude = amplitude;
  }

  /**
   * 振幅を返します。
   * 
   * @return 振幅
   */
  public double getAmplitude() {
    return this.amplitude;
  }

  /**
   * 周波数を設定します。
   * 
   * @param frequency 周波数
   */
  public void setFrequency(final double frequency) {
    this.frequency = frequency;
  }

  /**
   * 周波数を返します。
   * 
   * @return 周波数
   */
  public double getFrequency() {
    return this.frequency;
  }

  /**
   * 位相差を設定します。
   * 
   * @param phase 位相差
   */
  public void setPhase(final double phase) {
    this.phase = phase;
  }

  /**
   * 位相差を返します。
   * 
   * @return 位相差
   */
  public double getPhase() {
    return this.phase;
  }

  /**
   * @see org.mklab.tool.control.system.parameter.StringExternalizable#getString(java.lang.String)
   */
  public String getString(String key) {
    return Messages.getString(key);
  }

  /**
   * @see org.mklab.tool.control.system.SystemOperator#equals(java.lang.Object)
   */
  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!super.equals(o)) {
      return false;
    }
    if (o == null) {
      return false;
    }
    if (o.getClass() != getClass()) {
      return false;
    }
    DoubleSineWaveSource castedObj = (DoubleSineWaveSource)o;
    return ((this.bias == castedObj.bias) && (this.amplitude == castedObj.amplitude) && (this.frequency == castedObj.frequency) && (this.phase == castedObj.phase));
  }

  /**
   * @see org.mklab.tool.control.system.SystemOperator#hashCode()
   */
  @Override
  public int hashCode() {
    int hashCode = super.hashCode();
    hashCode = 31 * hashCode + (int)(Double.doubleToLongBits(this.bias) ^ (Double.doubleToLongBits(this.bias) >>> 32));
    hashCode = 31 * hashCode + (int)(Double.doubleToLongBits(this.amplitude) ^ (Double.doubleToLongBits(this.amplitude) >>> 32));
    hashCode = 31 * hashCode + (int)(Double.doubleToLongBits(this.frequency) ^ (Double.doubleToLongBits(this.frequency) >>> 32));
    hashCode = 31 * hashCode + (int)(Double.doubleToLongBits(this.phase) ^ (Double.doubleToLongBits(this.phase) >>> 32));
    return hashCode;
  }
}