マルチパス歪み波形式変形の補足
マルチパス歪み波形の復元
#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の値を大きくするとより原波形に近づく様子を観察すること.観察したときのパラメータを記すこと.