
因为数据存入shift reg需要一拍的时间,若选用5、2抽头需要对input单独延迟一拍,本例选用6、3抽头以及input作为滤波矩阵的列输入,避免对input的单独延迟处理。
每个时钟上升沿到来时,矩阵左列为抽头输入,其他列依次右移,如图所示。
①将9个数分成3组,每组3个数。求每一组的最大值、中值、最小值
②对3个最大值求最小值,对3个最小值求最大值,对3个中值求中值,得到3个数
③对这三个数求中值,这个数也是9个像素的中值

顶层模块:
// Module Name: mid_9_nums
// Target Device: xc7z010clg400-1
// Tool versions: vivado 2017.4
// Last Version: 2022.4.18
// Description: mid_filter
//port define
module mid_9_nums(
input clk,
input rst_n,
input [7:0] data_in,
output [7:0] data_out
);
parameter length = 9;
reg [7:0] data_reg [length-1:0];//9 shift reg
/*********max/mid/min reg**********/
wire [7:0] data_max [2:0];
wire [7:0] data_mid [2:0];
wire [7:0] data_min [2:0];
wire [7:0] data_min_max;
wire [7:0] data_max_min;
wire [7:0] data_mid_mid;
/**********************************/
/**************matrix**************/
reg [7:0] m11,m12,m13;
reg [7:0] m21,m22,m23;
reg [7:0] m31,m32,m33;
/**********************************/
wire [7:0] row1,row2;
reg [7:0] row3;
integer i;
//9 nums shift reg
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
for(i = 0; i < length; i = i + 1)begin
data_reg[i] <= 8'b0;
end
end
else begin
for(i = 0; i < length - 1; i = i + 1)begin
data_reg[i+1] <= data_reg[i];
data_reg[0] <= data_in;
end
end
end
/**************taps**************
→-----6 . . . -------→ 9 nums shift reg
↑
|5 4 3|
↑
→-----→
↑
|2 1 0|
↑
data_in
********************************/
assign row1 = data_reg[6];
assign row2 = data_reg[3];
always @(posedge clk)begin
row3 <= data_in;
end
//3*3 filter matrix
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
{m11,m12,m13,m21,m22,m23,m31,m32,m33} <= 72'd0;
end
else begin
{m11,m12,m13} <= {m12,m13,row1};
{m21,m22,m23} <= {m22,m23,row2};
{m31,m32,m33} <= {m32,m33,row3};
end
end
//output must be wire type
//input port must be connected
//instance
min_mid_max_3 stage1_tmp1(m11,m12,m13, data_min[2], data_mid[2], data_max[2]);
min_mid_max_3 stage1_tmp2(m21,m22,m23, data_min[1], data_mid[1], data_max[1]);
min_mid_max_3 stage1_tmp3(m31,m32,m33, data_min[0], data_mid[0], data_max[0]);
min_mid_max_3 stage2_tmp1(.in1(data_min[2]),.in2(data_min[1]),.in3(data_min[0]),.min(),.mid(),.max(data_min_max));
min_mid_max_3 stage2_tmp2(.in1(data_mid[2]),.in2(data_mid[1]),.in3(data_mid[0]),.min(),.mid(data_mid_mid),.max());
min_mid_max_3 stage2_tmp3(.in1(data_max[2]),.in2(data_max[1]),.in3(data_max[0]),.min(data_max_min),.mid(),.max());
min_mid_max_3 stage3_tmp(.in1(data_min_max),.in2(data_mid_mid),.in3(data_max_min),.min(),.mid(data_out),.max());
endmodule
子模块:求三个数的最大值、最小值、中值
// Module Name: min_mid_max_3
// Target Device: xc7z010clg400-1
// Tool versions: vivado 2017.4
// Description: take the middle value / minimum / maximum of 3 numbers
module min_mid_max_3(
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] min,
output reg [7:0] mid,
output reg [7:0] max
);
always @(*)begin
if(in1 > in2)begin
if(in2 > in3)begin
max = in1;
mid = in2;
min = in3;
end
else begin
if(in1 > in3)begin
max = in1;
mid = in3;
min = in2;
end
else begin
max = in3;
mid = in1;
min = in2;
end
end
end
else begin//1<2
if(in1 > in3)begin
max = in2;
mid = in1;
min = in3;
end
else begin
if(in2 > in3)begin
max = in2;
mid = in3;
min = in1;
end
else begin
max = in3;
mid = in2;
min = in1;
end
end
end
end
endmodule
testbench:
`timescale 1ns / 1ps
module tb_mid_num();
//10mhz
parameter CLK_PERIOD = 100;
reg clk;
reg rst_n;
reg [7:0] data_in;
wire [7:0] data_out;
always # (CLK_PERIOD/2) clk = ~clk;
initial begin
clk = 1'b0;
rst_n = 1'b0;
#300
rst_n = 1'b1;
end
//random input
always @(posedge clk)begin
data_in = {$random}%256;
end
//instance
mid_9_nums u_mid_num(clk, rst_n, data_in, data_out);
endmodule
从截取的部分仿真结果来看,当输入为连续的225、23、67、201、134、37、193、141、90时,下一个时钟上升沿来临时,67/37/90组成一列输入到中值滤波的3*3矩阵,并通过中值算法求出中值134,作为中值滤波的输出。

综合结果:

Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p