SineWaveSource.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.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
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
 * @param <RS> type of real scalar
 * @param <RM> type of real matrix
 * @param <CS> type of complex scalar
 * @param <CM> type of complex matrix
 */
public class SineWaveSource<RS extends RealNumericalScalar<RS,RM,CS,CM>, RM extends RealNumericalMatrix<RS,RM,CS,CM>, CS extends ComplexNumericalScalar<RS,RM,CS,CM>, CM extends ComplexNumericalMatrix<RS,RM,CS,CM>> extends ContinuousSource<RS,RM,CS,CM> implements StringExternalizable {

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

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

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

  /**
   * 新しく生成された<code>StepSignalSource</code>オブジェクトを初期化します。
   * @param sunit unit of scalar
   */
  public SineWaveSource(RS sunit) {
    this(sunit.create(1), sunit.create(1), sunit);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public RM outputEquation(final RS t) {
    final RS y = this.amplitude .multiply(this.frequency.multiply(t).add(this.phase).sin()).add(this.bias);
    RS[] oo = this.sunit.createArray(1);
    oo[0]= y;
    return this.sunit.createGrid(oo);
  }

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

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

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

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

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

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

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

  /**
   * 位相差を返します。
   * 
   * @return 位相差
   */
  public RS 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;
    }
    SineWaveSource<RS,RM,CS,CM> castedObj = (SineWaveSource<RS,RM,CS,CM>)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 + (this.bias.hashCode() ^ (this.bias.hashCode() >>> 32));
    hashCode = 31 * hashCode + (this.amplitude.hashCode() ^ (this.amplitude.hashCode() >>> 32));
    hashCode = 31 * hashCode + (this.frequency.hashCode() ^ (this.frequency.hashCode() >>> 32));
    hashCode = 31 * hashCode + (this.phase.hashCode() ^ (this.phase.hashCode() >>> 32));
    return hashCode;
  }
}