uniform.h
#pragma once
class uniform
{
private:
double a, b, generate_num;
int * seed;
int s;
int M, N, i, j;
public:
uniform()
{
M = 1048576;
N = 2045;
}
void generate();
double random_number(double, double, int *);
};
double uniform::random_number(double a, double b, int * seed)
{
(*seed) = N * (*seed) + 1;
(*seed) = (*seed) - ((*seed) / M) * M;
generate_num = static_cast<double>((*seed)) / M;
generate_num = a + (b - a) * generate_num;
return (generate_num);
}
gauss.h
#pragma once
#include "uniform.h"
uniform unif_num;
class gauss
{
private:
double mean, sigma, x, y, generate_num;
int s;
int * seed;
int i, j, m;
public:
gauss() {}
void generate();
double random_number(double, double, int *);
};
double gauss::random_number(double mean, double sigma, int * seed)
{
x = 0;
for (m = 0; m < 12; m++)
{
x += unif_num.random_number(0.0, 1.0, seed);
}
x = x - 6.0;
y = mean + x * sigma;
return (y);
}
sine.h
#pragma once
#include <math.h>
#include "gauss.h"
class sine
{
private:
double fs, snr, z, pi, nsr;
double * a, * f, * ph, * x;
int * seed;
int s, m, n, i, k, j;
public:
sine() {}
void generate();
void random_number(double *, double *, double *, int, double, double, int *, double *, int);
~sine()
{
delete[] a, f, ph, x;
}
};
void sine::random_number(double * a, double * f, double * ph, int m, double fs, double snr, int * seed, double * x, int n)
{
gauss gau_num;
pi = 4.0 * atan(1.0);
z = snr / 10.0;
z = pow(10.0, z);
z = 1.0 / (2 * z);
nsr = sqrt(z);
for (i = 0; i < m; i++)
{
f[i] = 2 * pi * f[i] / fs;
ph[i] = ph[i] * pi / 180.0;
}
for (k = 0; k < n; k++)
{
x[k] = 0.0;
for (i = 0; i < m; i++)
{
x[k] = x[k] + a[i] * sin(k * f[i] + ph[i]);
}
x[k] = x[k] + nsr * gau_num.random_number(0.0, 1.0, seed);
}
}
Sin_with_Noise.cpp
//产生200个数据,正弦信号的振幅分别为1、1、1,频率分别为10、17、50Hz,相位分别为45、10、88度
//采样频率150Hz,该正弦组合信号受到高斯白噪声的干扰,信噪比为5dB
#include <iostream>
#include <fstream>
#include "Sine.h"
using namespace std;
void main()
{
sine solution;
solution.generate();
}
void sine::generate()
{
cout << "输入正弦信号的个数:";
cin >> m;
cout << "输入数据长度:";
cin >> n;
cout << "输入采样频率:";
cin >> fs;
cout << "输入信噪比:";
cin >> snr;
cout << "输入各正弦信号的振幅:" << endl;
a = new double[m];
for (j = 0; j < m; j++)
{
cout << "a[" << j + 1 << "] = ";
cin >> a[j];
}
cout << "输入各正弦信号的频率:" << endl;
f = new double[m];
for (j = 0; j < m; j++)
{
cout << "f[" << j + 1 << "] = ";
cin >> f[j];
}
cout << "输入各正弦信号的相位:" << endl;
ph = new double[m];
for (j = 0; j < m; j++)
{
cout << "ph[" << j + 1 << "] = ";
cin >> ph[j];
}
cout << "输入随机数的种子:";
cin >> s;
//存放所产生的数据
x = new double[n];
random_number(a, f, ph, m, fs, snr, &s, x, n);
ofstream fout("sine.dat");
for (j = 0; j < n; j++)
fout << x[j] << endl;
fout.close();
}
Sin_without_Noise.cpp
//产生200个数据,单正弦信号的振幅为1,频率为5Hz,相位为45度,无噪声干扰
#include <iostream>
#include <fstream>
#include "Sine.h"
using namespace std;
void main()
{
sine solution;
solution.generate();
}
void sine::generate()
{
cout << "输入正弦信号的个数:";
cin >> m;
cout << "输入数据长度:";
cin >> n;
cout << "输入采样频率:";
cin >> fs;
cout << "输入信噪比:";
cin >> snr;
cout << "输入各正弦信号的振幅:";
a = new double[m];
for (j = 0; j < m; j++)
{
cin >> a[j];
}
cout << "输入各正弦信号的频率:";
f = new double[m];
for (j = 0; j < m; j++)
{
cin >> f[j];
}
cout << "输入各正弦信号的相位:";
ph = new double[m];
for (j = 0; j < m; j++)
{
cin >> ph[j];
}
cout << "输入随机数的种子:";
cin >> s;
//存放所产生的数据
x = new double[n];
random_number(a, f, ph, m, fs, snr, &s, x, n);
ofstream fout("sine.dat");
for (j = 0; j < n; j++)
fout << x[j] << endl;
fout.close();
}