数字信号产生之ARMA模型数据的产生

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);
}

 

 

arma.h

 

#pragma once
#include "gauss.h"
#include <stdlib.h>

class arma
{
private:
 double mean, sigma, temp;
 double * a, * b, * w, * generate_num;
 int * seed;
 int s, p, q, n, i, j, k, l, m;

public:
 arma() {}
 void generate();
 void random_number(double *, double *, int, int, double, double, int *, double *, int);
 ~arma()
 {
  delete[] a, b, w, generate_num;
 }
};

void arma::random_number(double * a, double * b, int p, int q, double mean, double sigma, int * seed, double * x, int n)
{
 w = new double[n];
 gauss gau_num;

 for (k = 0; k < n; k++)
  w[k] = gau_num.random_number(mean, sigma, seed);
 generate_num[0] = b[0] * w[0];
 for (k = 1; k <= p; k++)
 {
  temp = 0.0;
  for (l = 1; l <= k; l++)
  {
   temp += a[l] * generate_num[k - l];
  }
  temp = b[0] * w[k] - temp;
  if (q == 0)
  {
   generate_num[k] = temp;
   continue;
  }
  m = (k > q) ? q : k;
  for (l = 1; l <= m; l++)
  {
   temp += b[l] * w[k - l];
  }
  generate_num[k] = temp;
 }
 for (k = (p + 1); k < n; k++)
 {
  temp = 0.0;
  for (l = 1; l <= p; l++)
  {
   temp += a[l] * generate_num[k - l];
  }
  temp = b[0] * w[k] - temp;
  if (q == 0)
  {
   generate_num[k] = temp;
   continue;
  }
  m = (k > q) ? q : k;
  for (l = 1; l <= m; l++)
  {
   temp += b[l] * w[k - l];
  }
  generate_num[k] = temp;
 }
}

 

 

 

arma.cpp

 

//产生200个ARMA(2,2)模型数据
#include <iostream>
#include <iomanip>
#include <fstream>
#include "ARMA.h"

using namespace std;

void main()
{
 arma solution;
 solution.generate();
}

void arma::generate()
{
 cout << "输入ARMA(p,q)模型数据的长度:";
 cin >> n;
 cout << "输入ARMA(p,q)模型的自回归阶数:";
 cin >> p;
 cout << "输入ARMA(p,q)模型的滑动平均阶数:";
 cin >> q;
 cout << "输入ARMA(p,q)模型的自回归系数:" << endl;
 a = new double[p + 1];
 for (i = 0; i <= p; i++)
 {
  cout << "a[" << i << "] = ";
  cin >> a[i];
 }
 cout << "输入ARMA(p,q)模型的滑动平均系数:" << endl;
 b = new double[q + 1];
 for (i = 0; i <= q; i++)
 {
  cout << "b[" << i << "] = ";
  cin >> b[i];
 }
 cout << "输入产生白噪声所用的正态分布的均值:";
 cin >> mean;
 cout << "输入产生白噪声所用的正态分布的均方差:";
 cin >> sigma;
 cout << "输入随机数的种子:";
 cin >> s;
 //存放ARMA(p,q)模型的数据
 generate_num = new double[n];
 
 random_number(a, b, p, q, mean, sigma, &s, generate_num, n);

 ofstream fout("ARMA.dat");
 for (i = 0; i < n; i++)
  fout << generate_num[i] << endl;
 fout.close();
}

 

Matlab功率谱估计的详尽分析——绝对原创 功率谱估计是信息学科中的研究热点,在过去的30多年里取得了飞速的发展。现代谱估计主要是针对经典谱估计(周期图和自相关法)的分辨率低和方差性能不好的问题而提出的。其内容极其丰富,涉及的学科和领域也相当广泛,按是否有参数大致可分为参数模型估计和非参数模型估计,前者有AR模型、MA模型ARMA模型、PRONY指数模型等;后者有最小方差方法、多分量的MUSIC方法等。 ARMA谱估计叫做自回归移动平均谱估计,它是一种模型化方法。由于具有广泛的代表性和实用性,ARMA谱估计在近十几年是现代谱估计中最活跃和最重要的研究方向之一。 二: AR参数估计及其SVD—TLS算法。 谱分析方法要求ARMA模型的阶数和参数以及噪声的方差已知.然而这类要求在实际中是不可能提供的,即除了一组样本值x(1),x(2),…,x(T)以供利用(有时会有一定的先验知识)外,再没有其它可用的数据.因此必须估计有关的阶数和参数,以便获得谱密度的估计.在ARMA定阶和参数之估计中,近年来提出了一些新算法,如本文介绍的SVD—TLS算法便是其中之一。 三:实验结果分析和展望 1,样本数多少对估计误差的影响。(A=[1,0.8,-0.68,-0.46]) 图1 上部分为N=1000;下部分为取相同数据的前N=50个数据产生的结果。 图1 N数不同:子图一N=1000,子图二N=200,子图三 N=50 由图可知,样本数在的多少,在对功率谱估计的效果上有巨大的作用,特别在功率谱密度函数变化剧烈的地方,必须有足够多的数据才能完整的还原原始功率谱密度函数。 2,阶数大小对估计误差的影响。 A=[1,-0.9,0.76] A=[1,-0.9,0.76,-0.776] 图二 阶数为二阶和三阶功率密度函数图 A=[1,-0.9,0.86,-0.96,0.7] A=[1,-0.9,0.86,-0.96,0.7,-0.74] 图三 阶数为三阶和四阶功率密度函数图 如图所示,阶数相差不是很大时,并不能对结果产生较大的影响。但是阶数太低,如图二中二阶反而不能很好的估计出原始值。 3,样本点分布对估计误差 对于相同的A=[1,-0.9,0.86,-0.96,0.7];样本的不同,在估计时的误差是不可避免的。因此,我们在取得样本时,应该尽可能的减少不必要的误差。 图四:不同的样本得到不同的估计值 4,奇异值的阈值判定范围不同对结果的影响。 上图是取奇异值的阈值大于等于0.02,而下图是取阈值大于等于0.06,显然在同种数据下,阈值的选取和最终结果有密切关系。由于系数矩阵和其真实值的逼近的精确度取决于被置零的那些奇异值的平方和。所以选取太小,导致阶数增大,选取太大会淘汰掉真实的系数。根据经验值,一般取0.05左右为最佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值