iromono_in_cpp


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

wave_form系

下記のソースではうまく動かないことが大体わかりました。

FM波の合成について再度勉強中です。(11/06/06)

wave.h

//インクルードガードしていない
class IWave{
  public:
    virtual double operator()(double time)=0;
};

class RectWave:public IWave{
  public:
    RectWave(double duty);
    double operator()(double time);
  private:
    double duty;
};

class FMWave:public IWave{
  public:
    FMWave(double career,double modulator,double fm_param);
    double operator()(double time);
  private:
    double career;
    double modulator;
    double fm_param;
};

wave.cpp

#include"wave.h"
#include<math.h>

RectWave::RectWave(double duty):duty(duty){};

double RectWave::operator()(double time){
  return time < 0.5? 1.0:-1.0;
}

FMWave::FMWave(double career,double modulator,double fm_param)
:career(career),modulator(modulator),fm_param(fm_param){};

double FMWave::operator()(double time){
  double modwave = sin(2*M_PI*time*modulator);
  return sin(2*M_PI*time*career + fm_param*modwave);
};

wave_test.cpp

やはりこの方法だとサンプリング数が低いと

うまくFM波形が出てくれない。どうすんだろ。

#include"wave.h"
#include<iostream>
using namespace std;

void print_wave(IWave& wave,const unsigned int range=10){
  for(int i=0;i<range;i++){
    double level = wave(i*1/double(range));
    for(int j=-10;j*0.1<level;j++){
      cout << " ";
    }
    cout << "*" << endl;
  }
}

int main(){
  RectWave rec(0.5);
  cout << "RectWave Form\n" << endl;
  print_wave(rec);

  FMWave fm(220,440,0.5);
  cout << "FMWave Form\n" << endl;
  print_wave(fm,100);
}