C++ 实现 matlab 的 buttord函数

news2024/11/25 14:37:20

文章目录

    • 1. matlab 的 buttord函数 的作用
    • 2. matlab 的 buttord函数 的使用方法
    • 3. C++ 实现代码
    • 4. 测试代码和结果
      • 4.1 定义滤波器的设计指标的结构体
      • 4.2 C++ 测试文件
      • 4.3 测试结果

1. matlab 的 buttord函数 的作用

根据给定的巴特沃斯滤波器的指标计算滤波器的最低阶数和截止频率

2. matlab 的 buttord函数 的使用方法

clear,clc,close;
%1.数字滤波器的技术指标要求
ap = 1;%通带最大衰减
as = 30;%阻带最小衰减
fp = 200;%通带截止频率
fs = 400;%阻带截止频率
Fs = 1000;%抽样间隔
T = 1/Fs;
 
%2.将数字指标转化成模拟滤波器指标
wp=(2*pi*fp)/Fs;
ws=(2*pi*fs)/Fs;

disp("wp="+wp);
disp("ws="+ws);

% 数字指标转模拟指标 预畸变,前面要× (2/T)
wap=2*Fs*tan(wp/2);
was=2*Fs*tan(ws/2);
disp(wap);
disp(was);

%3.设计模拟滤波器
[N,wac]=buttord(wap,was,ap,as,'s');% N为阶数,wac为3dB截止频率, 's'表示设计的是模拟滤波器
disp("N="+N);
disp("wac="+wac);

在这里插入图片描述

3. C++ 实现代码

#pragma once
#include <math.h>

//输入参数 wap 为模拟低通滤波器通带截止频率 Hz
//输入参数 was 为模拟低通滤波器阻带截止频率 Hz
//输入参数 ap 为模拟低通滤波器通带最大衰减 db
//输入参数 as 为模拟低通滤波器阻带最小衰减 db
//输出参数 N 为需要计算的模拟巴特沃斯低通滤波器的阶数
//输出参数 wc 为需要计算的模拟巴特沃斯低通滤波器的3db截止频率
bool buttord(double wap, double was, int ap, int as, int* N, double* wc)
{
	// wap was ap as 都不能 <= 0
	if (wap <= 0.0001 || was <= 0.0001 || ap <= 0.0001 || as <= 0.0001 || N == NULL || wc == NULL)
	{
		return false;
	}
	double ksp = sqrt((pow(10, 0.1 * as) - 1) / (pow(10, 0.1 * ap) - 1));
	// 计算归一化频率
	double lambdasp = was / wap;
	*N = (int)ceil(log10(ksp) / log10(lambdasp));
	// 使用双线性变换法,应用阻带指标 was
	*wc = was * pow(pow(10, 0.1 * as) - 1, -1.0 / (2 * *N));
	return true;
}

4. 测试代码和结果

4.1 定义滤波器的设计指标的结构体

#pragma once

struct DESIGN_SPECIFICATION
{
	// 数字通带截止频率 Hz
	double digital_passband_cutoff_frequency;
	// 数字阻带截止频率 Hz
	double digital_stopband_cutoff_frequency;
	// 通带最大衰减 db
	int passband_max_attenuation;
	// 阻带最小衰减 db
	int stopband_min_attenuation;
	// 采样频率 Hz
	int fs;
};

4.2 C++ 测试文件

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "design_specification.h"
#include "buttord.h"

#define pi ((double)3.141592653589793)

int main()
{
	struct DESIGN_SPECIFICATION IIR_Filter;
	
	//1.数字滤波器的技术指标
	IIR_Filter.digital_passband_cutoff_frequency = 200; // Hz
	IIR_Filter.digital_stopband_cutoff_frequency = 400;// Hz
	IIR_Filter.passband_max_attenuation = 1; // db
	IIR_Filter.stopband_min_attenuation = 30;// db
	IIR_Filter.fs = 1000;// Hz
	
	//2.将数字指标转化成模拟滤波器技术指标
	double analog_passband_cutoff_frequency = (2 * pi * IIR_Filter.digital_passband_cutoff_frequency) / IIR_Filter.fs;
	double analog_stopband_cutoff_frequency = (2 * pi * IIR_Filter.digital_stopband_cutoff_frequency) / IIR_Filter.fs;
	//printf("wp = %lf, ws = %lf\n", analog_passband_cutoff_frequency, analog_stopband_cutoff_frequency);
	
	//3.数字指标转模拟指标 预畸变,前面要× (2/T)
	double wap = 2.0 * IIR_Filter.fs * tan(analog_passband_cutoff_frequency / 2);
	double was = 2.0 * IIR_Filter.fs * tan(analog_stopband_cutoff_frequency / 2);
	//printf("wap = %lf, was = %lf\n", wap, was);
	
	//4.计算巴特沃斯滤波器阶数 和 3db截止频率
	int* N = (int*)malloc(sizeof(int));
	double* wc = (double*)malloc(sizeof(double));
	
	bool ret = buttord(wap,
					was,
					IIR_Filter.passband_max_attenuation,
					IIR_Filter.stopband_min_attenuation,
					N,
					wc);
	printf("滤波器阶数:%d ,\n滤波器截止频率:%lf\n", *N, *wc);
	return 0;
}

4.3 测试结果

在这里插入图片描述
可以看出和 matlab 得到的结果相同

下面再给一组设计指标进行测试:
数字通带截止频率 10 Hz
数字阻带截止频率 50 Hz
通带最大衰减 2 db
阻带最小衰减 40 db
采样频率 200 Hz
下面是 Matlab 的测试结果

在这里插入图片描述

下面是我的 C++ 版本的测试结果
在这里插入图片描述
可以看出 matlab 和 C++ 两个版本的结果一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

k8s ingress controller 使用

目录 一 安装Ingress controller 二 创建service deploy 三 创建ingress 四 测试 一 安装Ingress controller apiVersion: v1 kind: Namespace metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginx--- # …

怎么把wav转换成mp3格式,5种方法值得收藏

怎么把wav转换成mp3格式&#xff1f;wav格式相信很多小伙伴们不是很熟悉&#xff0c;这种文件格式通常用于录音室等一些专业音乐项目上&#xff0c;那么wav格式和mp3格式有什么区别呢&#xff1f;wav全名Waveform Audio File Format&#xff0c;是微软公司开发的一种声音文件格…

【HarmonyOS】小熊派鸿蒙系统搭建

文章目录一、BearPi-HM Micro 开发板介绍二、Linux镜像下载三、BearPi-HM Micro编译环境配置1.首先添加如下镜像源2.更新镜像源3.安装依赖库及工具4.安装hb5.测试hb是否安装成功四、安装mkimage工具1.新建tools目录2.下载mkimage.stm32工具到~/tools目录&#xff0c;并复制到/h…

谷粒商城-分布式基础篇3

1.商品服务-品牌管理 把逆向生成的前端代码复制到前端src\views\modules\product 这样我们基本的增删改查就有了 全局搜索isAuth,修改返回值为true 关闭eslint build\webpack.base.conf.js const createLintingRule () > ({// test: /\.(js|vue)$/,// loader: eslint-lo…

真题详解(线性表)-软件设计(四十八)

原创 真题详解(UML图&#xff09;-软件设计&#xff08;四十七)https://blog.csdn.net/ke1ying/article/details/130096516 TCP 属于传输层&#xff0c; 用TCP连接的应用层有&#xff1a; SMTP&#xff08;25&#xff09; HTTP&#xff08;80&#xff09; Telnet&#xff08;…

kitti数据集中---标注数据label_2

标注文件中16个属性&#xff0c;即16列。但我们只能够看到前15列数据&#xff0c;因为第16列是针对测试场景下目标的置信度得分&#xff0c;也可以认为训练场景中得分全部为1但是没有专门标注出来。下图是000001.txt的标注内容和对应属性介绍。 相机坐标系中&#xff0c;y方向是…

【软考数据库】第一章 计算机系统基础知识

目录 1.1 计算机系统 1.1.1 计算机硬件组成 1.1.2 中央处理单元 1.1.3 数据表示 1.1.4 校验码 1.2 计算机体系结构 1.2.1 体系结构分类 1.2.2 指令系统存 1.2.3 储系系统 1.2.4 输入/输出技术 1.2.5 总线结构…

【Golang开发面经】字节跳动(三轮技术面)

一面 epoll、select、poll 区别 select 机制刚开始的时候&#xff0c;需要把 fd_set 从用户空间拷贝到内核空间&#xff0c;并且检测的 fd 数是有限制的&#xff0c;由 FD_SETSIZE 设置&#xff0c;一般是1024。数组实现。 poll 的实现和 select 非常相似&#xff0c;只是描…

Node【一】初识Node

文章目录&#x1f31f;前言&#x1f31f;Node.js&#x1f31f;特性&#xff1a;&#x1f31f;1. 单线程&#x1f31f;2.异步IO&#x1f31f;前端中的异步&#x1f31f;Node中的异步&#x1f31f;3.跨平台&#x1f31f;4.运行速度快&#x1f31f; 劣势&#xff1a;&#x1f31f;…

ASP一个物流商品运输系统的设计与实现

物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统&#xff0c;涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现&#xff0c;分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…

代码随想录算法训练营第43天 | 动态规划 背包理论基础 LeetCode1049.最后一块石头的重量II,494.目标和,474.一和零

代码随想录算法训练营第43天 | 动态规划 背包理论基础 LeetCode1049.最后一块石头的重量II&#xff0c;494.目标和&#xff0c;474.一和零 1049.最后一块石头的重量II 第一遍读题思考 重点在于背包问题的理论基础建议阅读以下两个链接。 背包问题理论基础&#xff0c;用二维…

sed命令基础

sed编辑器即流编辑器&#xff08;stream editor&#xff09;&#xff0c;根据命令处理数据流中的数据&#xff0c;这些命令可从命令行输入&#xff0c;或者指定文件中输入。 sed执行的操作如下&#xff1a; 1&#xff09;从输入读取一行数据 2&#xff09;根据提供的命令匹配数…

KSS-ICP: 基于形状分析技术的点云配准方法

目录 1. 概述 2. 算法实现 3. 实验结果 总结 Reference 三维点云配准是三维视觉领域一个经典问题&#xff0c;涉及三维重建&#xff0c;定位&#xff0c;SLAM等具体应用问题。传统的配准可以被分为两条技术路线&#xff0c;即基于全局姿态匹配的方法以及基于特征点对应的方法。…

疫情下社区管理系统的设计与实现(论文+源码)_kaic

疫情下社区管理系统 摘 要&#xff1a;新冠疫情下的社区人员管理系统是基于SpringBoot搭建的一套前后端分离系统。面向疫情下的社区管理人员和社区用户&#xff0c;主要用于进行社区服务&#xff0c;进行高效的社区人员管理。具有一定的经济效益和社会效益。本文分析了新冠疫情…

计算机网络第三章(数据链路层)【湖科大教书匠】

1. 概述 物理层发出去的信号需要通过数据链路层才知道是否到达目的地&#xff1b;才知道比特流的分界线 链路(Link)&#xff1a;从一个结点到相邻结点的一段物理线路&#xff0c;中间没有任何其他交换结点数据链路(Data Link)&#xff1a;把实现通信协议的硬件和软件加到链路…

【ROS实操2话题订阅输出乌龟位姿】

需求描述 已知turtlesim中的乌龟显示节点&#xff0c;会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向)&#xff0c;要求控制乌龟运动&#xff0c;并时时打印当前乌龟的位姿。 实现分析 1.首先&#xff0c;需要启动乌龟显示以及运动控制节点并控制乌龟运动。 2.要通过ROS命令…

网络原理TCP协议

hi,我们又见面了,今天为大家带来TCP协议,一共为大家介绍TCP协议的十个核心特性 1.确认应答 2.超时重传 3连接管理 4滑动窗口 5流量控制 6拥塞控制 7延迟应答 8捎带应答 9面向字节流(粘包问题) 10异常情况(心跳包) 11基于TCP应用层协议 TCP协议位于传输层,我们知道T…

微信小程序开发 | API应用案例(上)

API应用案例&#xff08;上&#xff09;5.1【案例1】用户登录5.1.1 案例分析5.1.2 前导知识5.1.3 搭建开发者服务器5.1.4 实现用户登录5.1.5 检查用户是否已经登录5.1.6 获取用户信息5.1.7 开放数据校验与解密5.2【案例2】个人中心5.2.1 案例分析5.2.2 前导知识5.2.3 实现底部标…

BE-SSL:基于边界增强自监督学习的脑结构分割

文章目录Boundary-Enhanced Self-supervised Learning for Brain Structure Segmentation摘要本文方法Supervoxel BranchRegistration BranchAtlas Selection实验结果Boundary-Enhanced Self-supervised Learning for Brain Structure Segmentation 摘要 边界增强自监督学习(…