资源简介
matlab filtfilt函数C语言实现,程序可直接运行验证,同时包含matlab验证程序
代码片段和文件信息
#include
#include
#include
#include
/*滤波总体流程:
1、确定延时系数zi
2、对数据进行镜像,消除边缘效应
3、正向滤波,反向滤波
4、将数据从滤波后的数据中截取出来*/
//filter函数
void filter(const float* x float* y int xlen float* a float* b int nfilt float* zi)//nfilt为系数数组长度,zi为延时系数
{
#define EPS 0.000001
float tmp;
int i j;
//判断a[0]是否为1,若不是,归一化下
if ((*a - 1.0 > EPS) || (*a - 1.0 < -EPS))
{
tmp = *a;
for (i = 0; i < nfilt; i++)
{
b[i] /= tmp;
a[i] /= tmp;
}
}
memset(y 0 xlen * sizeof(float));//将y清零,以双浮点为单位
//此处赋值a[0]=0可以直接一步循环到位,不需要讲b[0]*x[0]单独计算
a[0] = 0.0;
for (i = 0; i < xlen; i++)
{
for (j = 0; i >= j && j < nfilt; j++)
{
y[i] += (b[j] * x[i - j] - a[j] * y[i - j]);
}
//若滤波器阶数大于2,需加上延时系数
if (zi&&i < nfilt - 1) y[i] += zi[i];
}
a[0] = 1.0;//还原滤波系数
}
//矩阵乘法 m为a的行数,n为a的列数数,k为b的行数,第一个矩阵列数必须要和第二个矩阵的行数相同,输出结果存放在c中
void trmul(float *a float *b float *c int m int n int k)
{
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];
}
return;
}
//求逆矩阵,当返回值为0时成功,a变为逆矩阵
int rinv(float *a int n)//逆矩阵
{
int *is *js i j k l u v;
float d p;
is = (int *)malloc(n * sizeof(int));
js = (int *)malloc(n * sizeof(int));
for (k = 0; k <= n - 1; k++)
{
d = 0.0;
for (i = k; i <= n - 1; i++)
for (j = k; j <= n - 1; j++)
{
l = i * n + j; p = fabs(a[l]);
if (p > d) { d = p; is[k] = i; js[k] = j; }
}
if (is[k] != k)
for (j = 0; j <= n - 1; j++)
{
u = k * n + j; v = is[k] * n + j;
p = a[u]; a[u] = a[v]; a[v] = p;
}
if (js[k] != k)
for (i = 0; i <= n - 1; i++)
{
u = i * n + k; v = i * n + js[k];
p = a[u]; a[u] = a[v]; a[v] = p;
}
l = k * n + k;
a[l] = 1.0 / a[l];
for (j = 0; j <= n - 1; j++)
if (j != k)
{
u = k * n + j; a[u] = a[u] * a[l];
}
for (i = 0; i <= n - 1; i++)
if (i != k)
for (j = 0; j <= n - 1; j++)
if (j != k)
{
u = i * n + j;
a[u] = a[u] - a[i*n + k] * a[k*n + j];
}
for (i = 0; i <= n - 1; i++)
if (i != k)
{
u = i * n + k; a[u] = -a[u] * a[l];
}
}
for (k = n - 1; k >= 0; k--)
{
if (js[k] != k)
for (j = 0; j <= n - 1; j++)
{
u = k * n + j; v = js[k] * n + j;
p = a[u]; a[u] = a[v]; a[v] = p;
}
if (is[k] != k)
for (i = 0; i <= n - 1; i++)
{
u = i * n + k; v
相关资源
- C语言进阶源码---基于graphics实现图书
- 用C语言实现一个火车站的订票系统
- C语言通讯录管理系统彩色界面
- AES-128-CBC算法C语言源码已经修改,可
- c语言课程设计-职工信息管理系统-单
- C语言考研真题汇编完整版.txt
- 飞机票订购系统C语言课程设计报告全
- 页面置换算法(fifolruopt) C语言编写
- 四子棋c语言程序
- 仿射密码C语言程序代码
- 正则表达式(regex)C语言源码,超强
- c语言 Windows_程序设计_第五版
- 常用算法程序集C语言描述 第三版pd
- 游戏开发 c语言 程序设计 飞机大战
- 简易图书管理系统C语言
- 编译原理课程设计-C语言子集编译器
- 练习:基于c语言的8位二进制原码一位
- (严版C语言版数据结构源码.rar
- 一个C语言编译器源码
- C语言模糊控制程序
- 多表代换 加密解密 C语言实现
- C语言版经纬度与高斯投影相互转换函
- 宾馆客房管理系统-C语言
- 数据结构大作业 停车场管理 C语言
- 高质量程序设计指南:C++/C语言第
- 北航991数据结构与C语言程序设计历年
- C语言考研真题汇编 高清PDF
- C语言彩票管理系统
- UNIX/LINUX下C语言中文短信UCS2编码和解
- 可以将C语言转变为汇编的编译器
评论
共有 条评论