C语言窗函数法设计FIR滤波器完整程序解析

版权申诉
0 下载量 57 浏览量 更新于2024-10-27 收藏 237KB RAR 举报
资源摘要信息:"本压缩包文件名为'cyuyanshixianchuanghanshushejiFIR.rar',涉及软件设计与软件工程领域,特别是利用Visual C++进行编程。文件中包含了用C语言编写的程序,用于实现各种窗函数法设计有限冲激响应(Finite Impulse Response,简称FIR)滤波器,且该程序包含了详细的代码注释,便于理解和学习。 在数字信号处理中,FIR滤波器是一种基本且非常重要的数字滤波器。与无限冲激响应(Infinite Impulse Response,简称IIR)滤波器相比,FIR滤波器具有固定的相位特性,不需要担心稳定性和极点位置的问题。其设计方法之一就是窗函数法,它通过对理想低通滤波器的冲击响应进行截断,以实现实际的滤波器设计。 窗函数法的核心思想是选择一个合适的窗函数,使其在时域内对理想滤波器的冲击响应进行乘法操作,以此来控制频域内的旁瓣电平,从而得到一个在时域内有限长,频域内具有平滑过渡特性的滤波器。常见的窗函数有矩形窗、汉宁窗、汉明窗、布莱克曼窗等,它们各有优缺点,例如矩形窗旁瓣电平较高,但主瓣宽度较窄;而布莱克曼窗旁瓣电平低,但主瓣宽度较宽,过渡带较宽。 在本压缩包中的程序,详细实现了多种窗函数法设计FIR滤波器,用户可以根据需要选择不同的窗函数,设计出符合特定要求的FIR滤波器。例如,设计一个低通、高通、带通或带阻滤波器。每个程序都包含了详细注释,说明了每个代码段的作用,帮助用户理解每一步的设计过程和原理。 使用Visual C++进行开发时,程序员需要对C语言有较好的掌握,并熟悉Visual C++的开发环境。Visual C++是微软公司推出的集成开发环境(IDE),它提供了编写Windows应用程序的工具集,包括编译器、调试器、图形用户界面设计工具等,是开发Windows平台下软件应用程序的重要工具。 总之,本资源是一个针对软件设计与软件工程领域的有价值的学习和参考材料,尤其是对于那些希望深入了解和实践FIR滤波器设计的程序员而言,包含了实际可运行的代码示例和详细说明,是一份难得的参考资料。"

#include "prepare_ogm.hpp" namespace senior { namespace guardian { namespace prepare { std::string PrepareOgm::Name() { return "Prepare Ogm Element"; } void PrepareOgm::Initiate() {} void PrepareOgm::Process(data::DataFrame& his, data::DataFrame& cur) { if (cur.source_ogm_points_.is_invalid()) return; if (cur.source_visual_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_visual_ogm_points_.begin(), cur.source_visual_ogm_points_.end()); } if (cur.source_higher_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_higher_ogm_points_.begin(), cur.source_higher_ogm_points_.end()); } auto& predict_path = cur.monitor_data_.mutable_predict_path(); predict_path.GenerateBoundary(cur); cur.AABox2d_ = predict_path.vehicle_AABox2d_; // if (!his.monitor_data_.is_need_to_take_over()) { // LOG(INFO)<<"1"; cur.AABox2d_.SetWidth(cur.AABox2d_.width() + 1.0); cur.AABox2d_.SetLength(cur.AABox2d_.length() + 1.0); // } std::vector<math::Vec2d> corner_points_; cur.AABox2d_.GetAllCorners(&corner_points_); auto& polygon2d = predict_path.tractor_polygon2d_; math::Vec2d temp; VoxelGrid filter_; common::Time now = common::Time::Now(); for (auto& point : cur.source_ogm_points_) { temp.set_x(point.x()); temp.set_y(-point.y()); if (cur.AABox2d_.IsPointIn(temp)) { cur.AABB_ogm_points_.emplace_back(point); } } cur.guardian_diagnose_["Prepare_PrepareOgm_AABox_filter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); now = common::Time::Now(); filter_.VoxelGrid_ApplyFilter( cur.AABB_ogm_points_, cur.ogm_points_, corner_points_, 0.1, 0.1, 0); cur.guardian_diagnose_["Prepare_PrepareOgm_VoxelGrid_ApplyFilter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); cur.ogm_points_.set_stamp(cur.source_ogm_points_.stamp()); cur.ogm_points_.set_time(cur.source_ogm_points_.time()); cur.ogm_points_.set_delay_time(cur.source_ogm_points_.delay_time()); cur.ogm_points_.set_valid(); } } // namespace prepare } // namespace guardian } // namespace senior 改变为C语言程序

2023-06-13 上传