C语言实现的python里面的filtfilt函数.zip

  • dooiit
    了解作者
  • C/C++
    开发工具
  • 6KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 30
    下载次数
  • 2019-10-22 11:40
    上传日期
使用C语言实现了零相滤波器算法程序,优化了资源
C语言实现的python里面的filtfilt函数.zip
  • main.c
    1.3KB
  • matrix.h
    2.5KB
  • filtfilt.h
    593B
  • matrix.c
    10.1KB
  • filtfilt.c
    4.5KB
内容介绍
/* Matrix math. */ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include "matrix.h" /* 为矩阵分配初始空间 */ Matrix alloc_matrix(int rows, int cols) { Matrix m; int i; int j; m.rows = rows; m.cols = cols; m.data = (float**) MAT_MALLOC(sizeof(float*) * m.rows); for ( i = 0; i < m.rows; ++i) { m.data[i] = (float*) MAT_MALLOC(sizeof(float) * m.cols); assert(m.data[i]); for ( j = 0; j < m.cols; ++j) { m.data[i][j] = 0.0; } } return m; } /* 释放空间 */ void free_matrix(Matrix *m) { int i; if(m) { if(m->data) { for ( i = 0; i < m->rows; ++i) { if(m->data[i]) MAT_FREE(m->data[i]); } MAT_FREE(m->data); } m->data = NULL; } } /* 清零矩阵 */ void clr_matrix(Matrix m){ int i,j; for(i=0; i<m.rows; i++){ for(j=0;j<m.cols; j++){ m.data[i][j] = 0; } } } /* 初始化矩阵 */ void set_matrix(Matrix m, ...) { va_list ap; int i,j; va_start(ap, m); for ( i = 0; i < m.rows; ++i) { for ( j = 0; j < m.cols; ++j) { m.data[i][j] = (float)va_arg(ap, double); } } va_end(ap); } /* 转换为单元矩阵 */ void set_identity_matrix(Matrix m) { int i; int j; assert(m.rows == m.cols); for ( i = 0; i < m.rows; ++i) { for ( j = 0; j < m.cols; ++j) { if (i == j) { m.data[i][j] = 1.0; } else { m.data[i][j] = 0.0; } } } } /* 复制矩阵 */ void copy_matrix(Matrix source, Matrix destination) { int i; int j; assert(source.rows == destination.rows); assert(source.cols == destination.cols); for ( i = 0; i < source.rows; ++i) { for ( j = 0; j < source.cols; ++j) { destination.data[i][j] = source.data[i][j]; } } } /* 打印矩阵 */ void print_matrix(Matrix m) { int i; int j; for ( i = 0; i < m.rows; ++i) { for ( j = 0; j < m.cols; ++j) { if (j > 0) { MAT_PRINTF(" "); } MAT_PRINTF("%6.2f", m.data[i][j]); } MAT_PRINTF("\n"); } } /* 矩阵相加 */ void add_matrix(Matrix a, Matrix b, Matrix c) { int i; int j; assert(a.rows == b.rows); assert(a.rows == c.rows); assert(a.cols == b.cols); assert(a.cols == c.cols); for ( i = 0; i < a.rows; ++i) { for ( j = 0; j < a.cols; ++j) { c.data[i][j] = a.data[i][j] + b.data[i][j]; } } } /* 矩阵相减 */ void subtract_matrix(Matrix a, Matrix b, Matrix c) { int i; int j; assert(a.rows == b.rows); assert(a.rows == c.rows); assert(a.cols == b.cols); assert(a.cols == c.cols); for ( i = 0; i < a.rows; ++i) { for ( j = 0; j < a.cols; ++j) { c.data[i][j] = a.data[i][j] - b.data[i][j]; } } } /* 用单元矩阵减去该矩阵 */ void subtract_from_identity_matrix(Matrix a) { int i; int j; assert(a.rows == a.cols); for ( i = 0; i < a.rows; ++i) { for ( j = 0; j < a.cols; ++j) { if (i == j) { a.data[i][j] = 1.0f - a.data[i][j]; } else { a.data[i][j] = 0.0f - a.data[i][j]; } } } } /* 矩阵相乘 */ void multiply_matrix(Matrix a, Matrix b, Matrix c) { int i; int j; int k; assert(a.cols == b.rows); assert(a.rows == c.rows); assert(b.cols == c.cols); for ( i = 0; i < c.rows; ++i) { for ( j = 0; j < c.cols; ++j) { /* Calculate element c.data[i][j] via a dot product of one row of a with one column of b */ c.data[i][j] = 0.0; for ( k = 0; k < a.cols; ++k) { c.data[i][j] += a.data[i][k] * b.data[k][j]; } } } } /* 乘以一个矩阵的转置矩阵. */ void multiply_by_transpose_matrix(Matrix a, Matrix b, Matrix c) { int i; int j; int k; assert(a.cols == b.cols); assert(a.rows == c.rows); assert(b.rows == c.cols); for ( i = 0; i < c.rows; ++i) { for ( j = 0; j < c.cols; ++j) { /* Calculate element c.data[i][j] via a dot product of one row of a with one row of b */ c.data[i][j] = 0.0; for ( k = 0; k < a.cols; ++k) { c.data[i][j] += a.data[i][k] * b.data[j][k]; } } } } /* 矩阵转置 */ void transpose_matrix(Matrix input, Matrix output) { int i; int j; //int k; assert(input.rows == output.cols); assert(input.cols == output.rows); for ( i = 0; i < input.rows; ++i) { for ( j = 0; j < input.cols; ++j) { output.data[j][i] = input.data[i][j]; } } } /* 两矩阵是否相等 */ int equal_matrix(Matrix a, Matrix b, float tolerance) { int i; int j; //int k; assert(a.rows == b.rows); assert(a.cols == b.cols); for ( i = 0; i < a.rows; ++i) { for ( j = 0; j < a.cols; ++j) { if (abs(a.data[i][j] - b.data[i][j]) > tolerance) { return 0; } } } return 1; } /* 矩阵乘以一个系数 */ void scale_matrix(Matrix m, float scalar) { int i; int j; for ( i = 0; i < m.rows; ++i) { for ( j = 0; j < m.cols; ++j) { m.data[i][j] *= scalar; } } } /* 交换矩阵的两行 */ void swap_rows(Matrix m, int r1, int r2) { float *tmp; assert(r1 != r2); tmp = m.data[r1]; m.data[r1] = m.data[r2]; m.data[r2] = tmp; } /* 矩阵某行乘以一个系数 */ void scale_row(Matrix m, int r, float scalar) { int i; assert(scalar != 0.0f); for ( i = 0; i < m.cols; ++i) { m.data[r][i] *= scalar; } } /* Add scalar * row r2 to row r1. */ void shear_row(Matrix m, int r1, int r2, float scalar) { int i; assert(r1 != r2); for ( i = 0; i < m.cols; ++i) { m.data[r1][i] += scalar * m.data[r2][i]; } } /* 矩阵的求逆(借鉴他人) */ /* Uses Gauss-Jordan elimination. The elimination procedure works by applying elementary row operations to our input matrix until the input matrix is reduced to the identity matrix. Simultaneously, we apply the same elementary row operations to a separate identity matrix to produce the inverse matrix. If this makes no sense, read wikipedia on Gauss-Jordan elimination. This is not the fastest way to invert matrices, so this is quite possibly the bottleneck. */ int destructive_invert_matrix(Matrix input, Matrix output) { int i; int j; int r; float scalar; float shear_needed; assert(input.rows == input.cols); assert(input.rows == output.rows); assert(input.rows == output.cols); set_identity_matrix(output); /* Convert input to the identity matrix via elementary row operations. The ith pass through this loop turns the element at i,i to a 1 and turns all other elements in column i to a 0. */ for ( i = 0; i < input.rows; ++i) { if (input.data[i][i] == 0.0f) { /* We must swap rows to get a nonzero diagonal element. */ for (r = i + 1; r < input.rows; ++r) { if (input.data[r][i] != 0.0f) { break; } } if (r == input.rows) { /* Every remaining element in this column is zero, so this matrix cannot be inverted. */ return 0; } swap_rows(input, i, r); swap_rows(output, i, r); } /* Scale this row to ensure a 1 along the diagonal. We might need to worry about overflow from a huge scalar here. */ scalar = 1.0f / input.data[i][i]; scale_row(input, i, scalar); scale_row(output, i, scalar); /* Zero out the other elements in this column. */ for ( j = 0; j < input.rows; ++j) { if (i == j) { continue; } shear_needed = -input.data[j][i]; shear_row(input, j, i, shear_needed); shear_row(output, j, i, shear_needed); } } return 1; } /* 卡尔曼预测 */ void predict(Matrix* x_priori, Matrix* p_priori, Matrix Z, float timeStep) { Matrix A; Matrix H; Matrix Q; Matrix R; Matrix K; Matrix x_posteriori; Matrix p_posteriori; Matrix temp1; Matrix temp2; Matrix temp3; Matrix temp4; Matrix temp5; Matrix temp6; Matrix temp7; Matrix temp8; Matrix temp9; Matrix temp10; Matrix temp11; Matrix temp12; Matrix temp13; Matrix temp14; Matrix temp15; M
评论
    相关推荐
    • matlab最短路代码-FastFC:快速功能连接工具箱
      它与Matlab的filtfilt内置函数实现非常相似。 它执行N维的圆形填充(N =滤波顺序)。 功能连接性措施 相位同步度量:PLV,PLV的p值,PLI,wPLI和相干的虚部。 相互信息。 (实施MILCA)。 通用同步措施:S,H,M,L
    • SIM800C_MQTT.rar
      使用SIM800C模块,使用MQTT协议,连接中国移动onenet平台,能实现数据的订阅、发布、存储等
    • android从bootloader到launcher启动流程整理
      讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程
    • matlabpam代码-dsp-library:用于光通信的MATLABDSP函数库
      matlab pam代码 DSP库 该项目包含几种不同的功能,可将DSP算法应用于光通信。 这些功能适用于相干和非相干(PAM,DMT)光通信。 大多数功能是相互独立的。 因此,该代码中的功能可以轻松使用,并与其他DSP功能结合使用。 用法 功能列表以及简短说明在文件中。 输入和输出参数的描述在每个函数的标题中。 讯号 通常,输入(和输出)信号在第一维度上具有时间(例如,列向量),而第二维度用于一次管理多个信号(例如,不同的极化,不同的参数等)。 之所以选择这种约定,是因为MATLAB通过将列保留在内存的连续部分中来存储矩阵,因此,这种约定比其他方法(行向量)要快。 参数 大多数功能使用参数结构作为输入参数。 函数中使用的参数的描述通常在标头中,而coherent-dsp函数的默认参数在文件中。 参考 执照 此代码在下发布。
    • 有关多目标跟踪的PHD滤波的一些资料
      一些关于多目标跟踪的新的文献,主要是有关概率假设密度(PHD)的
    • 基于python开发的全国新工商采集工具 v1.2版本
      这个软件是通过scrapy爬虫框架结合代理IP池再加上request模拟请求技术以及验证码识别技术,可以做到日更新采集全国新工商信息。采集的数据自动存储在mysql数据库表里,可下载全量1.8亿多企业工商基本信息和36维度的详细信息.支持sql和excel导出数据包格式。
    • 卷积神经网络
      这是卷积神经网络的一个实际用例,已经调试好了,能够在matlab上成功运行,适合从事卷积神经网络(CNN)研究的人员学习使用。
    • matlab匹配滤波代码-matlab_for_thesis:Matlab博士学位论文代码
      matlab匹配滤波代码博士论文的MATLAB代码 博士论文的MATLAB代码的一部分,“井田双色散水下声通道中的多载波通信”。 函数下的func_JingTian文件夹 FUNC_JINGTIAN包含多载波通信中一些通常需要的功能: OFDM调制/解调模块,包括几种数据辅助的信道估计方法和差分解调; 快速实现GFDM和C-FBMC调制/解调,分别包括时域和频域的迫零(ZF)和匹配滤波(MF)均衡; 为OFDM信道估计中使用的压缩感测方法计算字典的功能; 增加信道效应,施加宽带多普勒失真的功能; 通过线性调频Z变换(CZT)以任意精度对频域中的信号进行重采样; Hermite函数合成的信号之间的交叉歧义函数的计算。 演示文件夹 以下列出了四个演示 demo1:使用基本追踪(BP)算法形式的压缩感知方法对OFDM进行稀疏2-D信道估计; demo2:比较基本数据辅助OFDM信道估计算法,包括常规频域插值和基于IDFT的变换域方法; demo3:圆形滤波器组多载波(C-FBMC / OQAM)的基于DFT特征向量的原型滤波器合成; demo4:用于广义频分复用(GFDM)的辅助日期辅助无干
    • Aerosim Blockset
      The AeroSim aeronautical simulation blockset provides a complete set of tools for the rapid development of nonlinear 6-degree of freedom aircraft dynamic models. In addition to the basic aircraft dynamics blocks, the library also includes complete aircraft models which can be customized through parameter files.
    • OFDM的MATLAB仿真
      1.使用Matlab实现一个OFDM系统。 OFDM系统具体参数参照LTE标准,具体为: 系统带宽:5MHz; OFDM符号长度:0.0714ms; 子载波间隔:15kHz; CP长度:OFDM符号长度的7 ; FFT点数:512; 2.选择一种降低OFDM系统峰均比的算法,在1的基础上实现,并分析其性能。