マルチパス歪み波形式変形の補足

マルチパス歪み波形式変形の補足

マルチパス歪み波形の復元

#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 70
#define Y_HEIGHT 100
int amplitude = 50; //送信波形振幅
int tau = 10;//サンプリング間隔
void disp(double f[], int x0Position, int y0position);
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)
{
  double s[X_WIDTH];//送信波形
  double x[X_WIDTH];//受信波形
  double y[X_WIDTH];//出力波形
  double a1;//直接波の振幅係数
  double a2;//反射波の振幅係数
  int n0;    //送信パルスの原点
  int n1;    //直接波伝搬時間(t1=n1*tau)
  int n2;    //反射波伝搬時間(t2=n2*tau)
  int k_max;  //kの最大値
  int delta_n;  //反射波と直接波の伝搬時間差
  int x0position, y0position;
  int i, j,k;
  n0 = 10;
  printf("歪み波形の復元");
  printf("直接波振幅係数を入力 a1(0.5-1.0)=?");
  scanf_s("%lf", &a1,255);
  printf("反射波振幅係数を入力 a2(0.5-1.0)=?");
  scanf_s("%lf", &a2, 255);
  printf("直接波伝搬時間を入力 n1(5-10)=?");
  scanf_s("%d", &n1, 255);
  printf("反射波伝搬時間を入力 n2(n2>n1)=?");
  scanf_s("%d", &n2, 255);
  printf("kの最大値を入力 k_max(1-10)=?");
  scanf_s("%d", &k_max, 255);
  x0position = 50;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  //送信波形
  for (i = 0; i < X_WIDTH; i++)
  {
    s[i] = 0.0;
  }
  for (i = n0; i < n0 + 5; i++)
  {
    s[i] = 1.0;
  }
  y0position = 80;
  disp(s, x0position, y0position);
  //受信波形
  for (i = 0; i < X_WIDTH; i++)
  {
    x[i] = 0;
    if (i < n1)
      x[i] = 0.0;
    else if (i < n2)
      x[i] = a1 * (double)s[i - n1];
    else
      x[i] = a1 * (double)s[i - n1] + a2*(double)s[i - n2];
  }
  y0position += 100;
  disp(x, x0position, y0position);
  /* 復元 */
  delta_n = n2 - n1;
  for (i = 0; i < X_WIDTH; i++)
  {
   //ここにマルチパスの影響から復元するためのコードを書き入れる
  }
  y0position += 100;
  disp(y, x0position, y0position);
  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 disp(double f[], int x0Position, int y0position)
{
  int i, j;
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  Line2D(x0Position, y0position - amplitude, x0Position, y0position + amplitude, 1.0);
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  Line2D(x0Position, y0position, x0Position + X_WIDTH, y0position, 1.0);
  glLineWidth(1);
  glBegin(GL_LINE_STRIP);
  glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
  glVertex2i(x0Position, y0position - f[0]);
  for (i = 1; i < X_WIDTH; i++)
  {
    glVertex2i(x0Position + i*tau , y0position - f[i]*amplitude);
  }
  glEnd();
  glPointSize(3);
  glBegin(GL_POINTS);
  glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
  for (i = 1; i < X_WIDTH; i++)
  {
    glVertex2i(x0Position + i*tau, y0position - f[i] * amplitude);
  }
  glEnd();
}

実行例


ソースコード

ソースコード

課題

(1)マルチパスによるひずみを復元するためのコードを書き入れよ.
(2)マルチパスによるひずみが除去されている様子を観察せよ.k_maxの値を大きくするとより原波形に近づく様子を観察すること.観察したときのパラメータを記すこと.

マルチパス歪みの復元