#include "MatrixUtils.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#include <assert.h>
#include "complex.h"
#include "complexarray.h"
#include "constants.h"
#include "commonutils.h"
/*************************************************************************
* @brief : Characteristic polynomial or polynomial with specified roots, matlab函数
* @inparam : p 复矩阵
* np 复矩阵的大小
* @outparam: d 返回复矩阵
*************************************************************************/
void complex_poly(Complex *p, int np, Complex *d)
{
Complex *c = (Complex *)malloc((np + 1) * sizeof(Complex));
c[0].real = 1.0;
c[0].imaginary = 0.0;
d[0] = c[0];
for (int i = 1; i < np + 1; i++)
{
c[i].real = 0.0;
c[i].imaginary = 0.0;
d[i]=c[i];
}
Complex temp;
for (int i = 0; i < np; i++)
{
for (int j = 1; j <= i + 1; j++)
{
temp = complex_multiply(p[i], d[j - 1]);
c[j].real = d[j].real - temp.real;
c[j].imaginary = d[j].imaginary - temp.imaginary;
}
for (int j = 1; j <= i + 1; j++)
{
d[j].real = c[j].real;
d[j].imaginary = c[j].imaginary;
}
}
free(c);
}
/*************************************************************************
* @brief : Characteristic polynomial or polynomial with specified roots, matlab函数
* @inparam : p 实数矩阵
* np 实数矩阵的大小
* @outparam: d 返回复数矩阵
*************************************************************************/
void poly(double *p, int np, double *d)
{
double *temp = (double *)malloc(sizeof(double) * np * np);
for (size_t i = 0; i < np; i++)
{
for (size_t j = 0; j < np; j++)
{
temp[i * np + j] = p[i * np + j];
}
}
// eig(A)
double *u_real = (double *)malloc(sizeof(double) * np);
double *v_imag = (double *)malloc(sizeof(double) * np);
int jt = 60;
hhbg(temp, np);
hhqr(temp, np, EPS, jt, u_real, v_imag);
Complex *dt = (Complex *)malloc(sizeof(Complex) * (np + 1));
Complex *dtt = (Complex *)malloc(sizeof(Complex) * (np + 1));
dt[0].real = 1;
dt[0].imaginary = 0;
for (size_t i = 1; i < np + 1; i++)
{
dt[i].real = 0;
dt[i].imaginary = 0;
}
for (size_t i = 0; i < np; i++)
{
for (size_t j = 1; j <= i + 1; j++)
{
dtt[j] = complex_subtract(dt[j], complex_multiply(create(u_real[i], v_imag[i]), dt[j - 1]));
}
for (size_t j = 1; j <= i + 1; j++)
{
dt[j].real = dtt[j].real;
dt[j].imaginary = dtt[j].imaginary;
}
}
for (size_t i = 0; i < np + 1; i++)
{
d[i] = dt[i].real;
}
free(temp);
free(u_real);
free(v_imag);
free(dt);
free(dtt);
}
/// @brief 根据列向量p(多项式的根)获取多项式系数
/// @param p
/// @param np
/// @param d
void vector_poly(double *p, int np, double *d)
{
// 初始化多项式系数
double *dt = (double *)malloc(sizeof(double) * (np + 1));
double *dtt = (double *)malloc(sizeof(double) * (np + 1));
for (int i = 0; i <= np; ++i) {
dt[i] = 0.0;
}
dt[0] = 1.0;
for (size_t i = 0; i < np; i++)
{
for (size_t j = 1; j <= i + 1; j++)
{
dtt[j] = dt[j]-p[i]*dt[j - 1];
}
for (size_t j = 1; j <= i + 1; j++)
{
dt[j] = dtt[j];
}
}
for (size_t i = 0; i < np + 1; i++)
{
d[i] = dt[i];
}
free(dt);
free(dtt);
}
Complex *poly_complex_array(Complex *p, int np)
{
Complex *c = (Complex *)malloc((np + 1) * sizeof(Complex));
Complex *d = (Complex *)malloc((np + 1) * sizeof(Complex));
c[0].real = 1.0;
c[0].imaginary = 0.0;
d[0].real = 1.0;
d[0].imaginary = 0.0;
for (int i = 1; i < np + 1; i++)
{
c[i].real = 0.0;
c[i].imaginary = 0.0;
d[i].real = 0.0;
d[i].imaginary = 0.0;
}
Complex temp;
for (int i = 0; i < np; i++)
{
for (int j = 1; j <= i + 1; j++)
{
temp = complex_multiply(p[i], d[j - 1]);
c[j].real = d[j].real - temp.real;
c[j].imaginary = d[j].imaginary - temp.imaginary;
}
for (int j = 1; j <= i + 1; j++)
{
d[j].real = c[j].real;
d[j].imaginary = c[j].imaginary;
}
}
free(c);
return d;
}
Complex *poly_complex(Complex p)
{
Complex *c = (Complex *)malloc(2 * sizeof(Complex));
Complex *d = (Complex *)malloc(2 * sizeof(Complex));
c[0].real = 1.0;
c[0].imaginary = 0.0;
d[0].real = 1.0;
d[0].imaginary = 0.0;
for (int i = 1; i < 2; i++)
{
c[i].real = 0.0;
c[i].imaginary = 0.0;
d[i].real = 0.0;
d[i].imaginary = 0.0;
}
Complex temp;
for (int i = 0; i < 1; i++)
{
for (int j = 1; j <= i + 1; j++)
{
temp = complex_multiply(p, d[j - 1]);
c[j].real = d[j].real - temp.real;
c[j].imaginary = d[j].imaginary - temp.imaginary;
}
for (int j = 1; j <= i + 1; j++)
{
d[j].real = c[j].real;
d[j].imaginary = c[j].imaginary;
}
}
free(c);
return d;
}
/*************************************************************************
* @brief : 实数矩阵相乘
* @inparam : a 矩阵A
* b 矩阵B
* m 矩阵A与乘积矩阵C的行数
* n 矩阵A的行数,矩阵B的列数
* k 矩阵B与乘积矩阵C的列数
* @outparam: c 乘积矩阵 C=AB
*************************************************************************/
void trmul(double a[], double b[], int m, int n, int k, double c[])
{
int i, j, l, u;
for (i = 0; i <= m - 1; i++)
for (j = 0; j <= k - 1; j++)
{
u = i * k + j;
c[u] = 0.0;
for (l = 0; l <= n - 1; l++)
c[u] = c[u] + a[i * n + l] * b[l * k + j];
}
}
//计算逆的主函数
double *inver(double *arr,int n)
{
double* res = (double *)malloc(sizeof(double) * n * n);
double W[n*n], L[n*n], U[n*n], L_n[n*n], U_n[n*n];
int i, j, k, d;
float s;
// 赋初值
for(i=0;i<n;i++){
for(j=0;j<n;j++){
W[i*n+j] = arr[i*n+j];
L[i*n+j] = 0.0;
U[i*n+j] = 0.0;
L_n[i*n+j] = 0.0;
U_n[i*n+j] = 0.0;
res[i*n+j] = 0.0;
}
}
for(i=0;i<n;i++) // L对角置1
{
L[i*n+i] = 1.0;
}
for(j=0;j<n;j++)
{
U[j] = W[j];
}
for(i=1;i<n;i++)
{
L[i*n] = W[i*n] / U[0];
}
for(i=1;i<n;i++)
{
for(j=i;j<n;j++) // 求U
{
s = 0.0;
for(k=0;k<i;k++)
{
s += L[i*n+k] * U[k*n+j];
}
U[i*n+j] = W[i*n+j] - s;
}
for(d=i;d<n;d++) // 求L
{
s = 0;
for(k=0;k<i;k++)
{
s += L[d*n+k] * U[k*n+i];
}
L[d*n+i] = (W[d*n+i] - s) / U[i*n+i];
}
}
for(j=0;j<n;j++) //求L的逆
{
for(i=j;i<n;i++)
{
if(i==j)
L_n[i*n+j] = 1.0 / L[i*n+j];
else if(i<j)
L_n[i*n+j] = 0.0;
else
{
s = 0.0;
for(k=j;k<i;k++)
{
s += L[i*n+k] * L_n[k*n+j];
}
L_n[i * n + j] = -1.0 * L_n[j * n + j] * s;
}
}
}
for(i=0;i<n;i++) //求U的逆
{
for(j=i;j>=0;j--)
{
if(i==j)
U_n[j*n+i] = 1.0 / U[j*n+i];
else if(j>i)
U_n[j*n+i] = 0.0;
else
{
s = 0.;
for(k=j+1;k<=i;k++)
{
s += U[j*n+k] * U_n[k*n+i];
}
U_n[j*n+i] = -1.0 / U[j*n+j] * s;
}
}
}
for(i=0;i<n;i++)
{
f
没有合适的资源?快使用搜索试试~ 我知道了~
Matlab IIR滤波器 C实现 已测试
共34个文件
c:14个
h:14个
json:3个
需积分: 0 3 下载量 47 浏览量
2024-01-11
13:54:30
上传
评论
收藏 221KB ZIP 举报
温馨提示
切比雪夫Ⅰ型,Ⅱ型,巴特沃斯,贝塞尔,椭圆等IIR滤波器 参考 mathlab中对应函数实现 并对C实现代码进行测试,基本通过 同时包含测试代码
资源推荐
资源详情
资源评论
收起资源包目录
IIR_bak.zip (34个子文件)
IIR_bak
Elliptic.exe 267KB
Elliptic.h 1KB
Chebyshv2.c 7KB
.vscode
settings.json 1KB
tasks.json 818B
launch.json 945B
Chebyshv2.h 1KB
ComplexArray.h 2KB
Butterworth.h 1KB
ComplexArray.c 7KB
Ellipdeg.c 7KB
Bessel.c 30KB
FiltertransUtils.h 2KB
Elliptic.c 8KB
tet.md 2KB
Ellipdeg.h 908B
Chebyshv1.h 1KB
MatrixUtils.c 34KB
Butterworth.c 6KB
Complex_eig.c 12KB
DoubleAccuracy.c 3KB
Complex.h 2KB
CommonUtils.c 15KB
Complex.c 7KB
complex_eig.h 2KB
CommonUtils.h 2KB
TestC.exe 267KB
MatrixUtils.h 5KB
Constants.h 785B
Bessel.h 1KB
TestC.c 4KB
DoubleAccuracy.h 1KB
FiltertransUtils.c 7KB
Chebyshv1.c 8KB
共 34 条
- 1
资源评论
zzzLeaon
- 粉丝: 114
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java-leetcode题解之第557题反转字符串中的单词III.zip
- java-leetcode题解之第521题最长的特殊序列I.zip
- java-leetcode题解之第459题重复的子字符串.zip
- java-leetcode题解之第443题压缩字符串.zip
- java-leetcode题解之第415题字符串相加.zip
- java-leetcode题解之第387题字符串中的第一个唯一字符.zip
- java-leetcode题解之第165题比较版本号.zip
- java-leetcode题解之第67题二进制求和.zip
- javaleetcode题解之第58题最后一个单词的长度.zip
- 基于Javascript和Vue的微信小程序抽奖打地鼠游戏设计源码 - 抽奖打地鼠
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功