移動平均(ランダムノイズ)

#include <GL/freeglut.h>
#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <stdio.h>
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define X_WIDTH 700
#define Y_HEIGHT 100
void disp0(int source[], int x0Position, int y0position, int amplitude);
void Line2D(int x1, int y1, int x2, int y2, float size) {
  glLineWidth(size);
  glBegin(GL_LINES);
  glVertex2i(x1, y1);
  glVertex2i(x2, y2);
  glEnd();
}
void display(void)
{
  int source[X_WIDTH];    //原波形
  int noisy[X_WIDTH];    //雑音を含む波形
  int average[X_WIDTH];    //移動平均をとった波形
  int tidePeriod;// = 50;//原波形の周期
  int noiseAmplitude;//ノイズの振幅
  int k;//片側平均個数
  int r = 0;//ノイズ
  int signalAmplitude;
  double max = RAND_MAX;
  int x0Position, y0position;
  int i, j;
  char input[255];
  //原波形の周期を入力");
  tidePeriod = 50;
  //原波形の振幅を入力(10-40));
  signalAmplitude = 30;
  //雑音の振幅を入力
  noiseAmplitude = ***;
  //片側平均個数を入力
  k = ***;
  x0Position = 50;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  //原波形-------------------------------------------------------------------------
  for (i = 0; i < X_WIDTH; i++)
  {
    source[i] = signalAmplitude*sin(2.0*M_PI*(double)i / (double)tidePeriod);
  }
  y0position = 70;
  disp0(source, x0Position, y0position, signalAmplitude);
  //雑音を付加した波形表示-------------------------------------------------------------------------
  srand(r++);
  for (i = 0; i < X_WIDTH; i++)
  {
    noisy[i] = source[i] + 2.0 * noiseAmplitude * (rand() / max - 0.5);
  }
  y0position += 100;
  disp0(noisy, x0Position, y0position, signalAmplitude);
  //移動平均をとった波形-------------------------------------------------------------------------
  for (i = k; i < X_WIDTH - k; i++)
  {
    //この場所にコーディングして書き入れる
    //noisy[i]配列には現波形にノイズが混入したデータであるので,
    //これを片側平均個数を「k」とする移動平均を計算して,
    //移動平均の結果をaverage[i]に格納する.
  }
  y0position += 100;
  disp0(average, x0Position, y0position, signalAmplitude);
  glFlush();
}
void Init() {
  glClearColor(0.0, 0.0, 0.0, 1.0);
  glOrtho(0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, -1, 1);
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
  glutInitDisplayMode(GLUT_RGBA);
  glutCreateWindow("波形描画");
  glutDisplayFunc(display);
  Init();
  glutMainLoop();
  return 0;
}
void disp0(int source[], int x0Position, int y0position, int amplitude)
{
  int i, j;
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  //X軸,Y軸描画
  Line2D(x0Position, y0position - amplitude, x0Position, y0position + amplitude, 1.0);
  Line2D(x0Position, y0position, x0Position + X_WIDTH, y0position, 1.0);
  glLineWidth(1);
  glBegin(GL_POINTS);
  glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
  glVertex2i(x0Position, y0position - source[0]);
  for (i = 1; i < X_WIDTH; i++)
  {
    glVertex2i(x0Position + i, y0position - source[i]);
  }
  glEnd();
}

実行例(ランダムノイズ)



ソースコード(ランダムノイズ)

ソースコード

移動平均(ドリフトノイズ)

#include <GL/freeglut.h>
#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <stdio.h>
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define X_WIDTH 700
#define Y_HEIGHT 100
void disp0(int source[], int x0Position, int y0position, int amplitude);
void Line2D(int x1, int y1, int x2, int y2, float size) {
  glLineWidth(size);
  glBegin(GL_LINES);
  glVertex2i(x1, y1);
  glVertex2i(x2, y2);
  glEnd();
}
void display(void)
{
  int source[X_WIDTH] = { 0 };    //原波形
  int noisy[X_WIDTH] = { 0 };    //雑音を含む波形
  int average[X_WIDTH] = { 0 };    //移動平均をとった波形
  int denoise[X_WIDTH] = {0}; //ドリフトノイズを除去したもの
  int tidePeriod;// = 50;//原波形の周期
  int noiseAmplitude;//ノイズの振幅
  int DriftTidePeriod;
  int k;//片側平均個数
  int r = 0;//ノイズ
  int signalAmplitude;
  double max = RAND_MAX;
  int x0Position, y0position;
  int i, j;
  char input[255];
  //ここの数値を変える(ここから)
  //原波形の周期を入力");
  tidePeriod = 30;
  //原波形の振幅を入力(10-40));
  signalAmplitude = 30;
  //雑音の振幅を入力(2-10)
  noiseAmplitude = ***;
  //ドリフトノイズの周期を入力
  DriftTidePeriod = ***;
  //片側平均個数を入力
  k = ***;
  //ここの数値を変える(ここまで)
  x0Position = 50;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  //原波形-------------------------------------------------------------------------
  for (i = 0; i < X_WIDTH; i++)
  {
    source[i] = signalAmplitude*sin(2.0*M_PI*(double)i / (double)tidePeriod);
  }
  y0position = 70;
  disp0(source, x0Position, y0position, signalAmplitude);
  //ドリフト雑音を付加した波形表示-------------------------------------------------------------------------
  for (i = 0; i < X_WIDTH; i++)
  {
    noisy[i] = source[i] + noiseAmplitude *cos(2.0 * M_PI *(double)i / (double)DriftTidePeriod);
  }
  y0position += 100;
  disp0(noisy, x0Position, y0position, signalAmplitude);
  //移動平均をとった波形-------------------------------------------------------------------------
  for (i = k; i < X_WIDTH - k; i++)
  {
    //この場所にコーディングして書き入れる
    //noisy[i]配列には現波形にノイズが混入したデータであるので,
    //これを片側平均個数を「k」とする移動平均を計算して,
    //移動平均の結果をaverage[i]に格納する.
  }
  y0position += 100;
  disp0(average, x0Position, y0position, signalAmplitude);
  //ドリフトノイズを除去した波形
  for (i = 0; i < X_WIDTH; i++)
  {
    denoise[i] = noisy[i] - average[i];
  }
  y0position += 100;
  disp0(denoise, x0Position, y0position, signalAmplitude);
  glFlush();
}
void Init() {
  glClearColor(0.0, 0.0, 0.0, 1.0);
  glOrtho(0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, -1, 1);
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
  glutInitDisplayMode(GLUT_RGBA);
  glutCreateWindow("波形描画");
  glutDisplayFunc(display);
  Init();
  glutMainLoop();
  return 0;
}
void disp0(int source[], int x0Position, int y0position, int amplitude)
{
  int i, j;
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  //X軸,Y軸描画
  Line2D(x0Position, y0position - amplitude, x0Position, y0position + amplitude, 1.0);
  Line2D(x0Position, y0position, x0Position + X_WIDTH, y0position, 1.0);
  glLineWidth(1);
  glBegin(GL_POINTS);
  glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
  glVertex2i(x0Position, y0position - source[0]);
  for (i = 1; i < X_WIDTH; i++)
  {
    glVertex2i(x0Position + i, y0position - source[i]);
  }
  glEnd();
}

移動平均(ドリフトノイズ)実行例



移動平均(ドリフトノイズ)ソースコード

ソースコード

課題

(1)ノイズが付加された波形からノイズを除去するための,移動平均処理部分を記入せよ.レポートには,移動平均の波形を導出するプログラムを記載すること. 
(2)移動平均によってランダムノイズが除去されている様子を観察する.そのときには,ノイズの振幅の大きさを変えたときと,平均個数を変えたときに,復元波形がどのようになるか,違いがわかるパターンを観察して,そのときのパラメータと画像を示すこと.特に,移動平均をとることによる,原波形への影響について検討すること.
(3)移動平均をとることで,ドリフトノイズを抽出し,それを除去できることを確認せよ.移動平均のプログラム部分は,ランダムノイズと同じでよい.ノイズの周期と移動平均の幅について,ドリフトノイズ 用に変更して,どのようなドリフトノイズを除去できるか,除去できる様子を観察せよ.レポートには,観察したときのノイズの周期と移動平均をとる片側平均個数を示すこと.

提出方法

締切日時:4月24日授業開始時
提出先:印刷したものを授業前に提出する
題名:ディジタル信号処理(移動平均)
提出物:課題に対する問題文と解答および,得られた結果に対する説明を示したもの.
章立てなどをする必要はない.問いに対する解答および説明が十分に示されていればよい.