国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例)

這篇具有很好參考價值的文章主要介紹了通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

??眾所周知,Matlab 中的 Filter Designer 可以直接生成 FIR 濾波器的 verilog 代碼,可以方便地生成指定階數(shù)、指定濾波器參數(shù)的高通、低通、帶通濾波器,生成的 verilog 代碼也可以指定輸入輸出信號的類型和位寬。然而其生成的代碼實(shí)在算不上美觀,復(fù)用性也很差,要實(shí)現(xiàn)不同濾波特性的切換就要生成多個濾波器的代碼。

??出于以上考慮,自己設(shè)計(jì)實(shí)現(xiàn)了 FIR 濾波器的通用 verilog 代碼,其濾波器參數(shù)通過接口輸入,從而可以通過輸入不同的參數(shù)獲得相應(yīng)的濾波結(jié)果。verilog 代碼如下:

/* 
 * file         : FIR_filter.v
 * author       : 今朝無言
 * date		    : 2023-07-03
 * version      : v1.0
 * description  : FIR 濾波器
 */
module FIR_filter(
input							clk,
input							rst_n,

input				[16*N-1:0]	filter_params,

input		signed	[15:0]		data_in,
output	reg	signed	[15:0]		data_out
);

parameter	N		= 32;	//濾波器參數(shù)個數(shù)
parameter	div_N	= 16;	//sum結(jié)果除 2^div_N,作為 filter 的輸出

//FIR 濾波器參數(shù)
reg	signed	[15:0] b[0:N-1];

integer	m;
always @(*) begin
	for(m=0; m<N; m=m+1) begin
		b[m]	<= filter_params[(m << 4) +: 16];
	end
end

reg	signed	[15:0]	shift_reg[0:N-1];

integer	i;
always @(posedge clk) begin
	if(~rst_n) begin
		for(i=N-1; i>=0; i=i-1) begin
			shift_reg[i]	<= 16'd0;
		end
	end
	else begin
		for(i=N-1; i>0; i=i-1) begin
			shift_reg[i]	<= shift_reg[i-1];
		end
		shift_reg[0]		<= data_in;
	end
end

reg		signed	[31:0]	multi[0:N-1];

integer	j;
always @(*) begin
	for(j=0; j<N; j=j+1) begin
		multi[j]	<= shift_reg[j] * b[j];
		//這里可以考慮使用multiplier IP核,使用LUT搭建(而這里直接乘使用的是DSP資源,一般的FPGA芯片只有幾百個)
	end
end

reg		signed	[47:0]	sum;

integer	k;
always @(*) begin
	sum		= 0;
	for(k=0; k<N; k=k+1) begin
		sum	= sum + multi[k];
	end
end

always @(posedge clk) begin
	data_out	<= sum[47-div_N : 32-div_N];
end

endmodule

Lowpass Filter示例

??當(dāng)濾波器階數(shù)較高時,濾波器參數(shù)如何給出無疑是個麻煩事,因此又編寫了 matlab 代碼,可以一鍵生成所需的 .v 文件以實(shí)現(xiàn)參數(shù)的配置:

%-----------FIR濾波器參數(shù)(生成.v)-----------------
clc,clear,close all

fs=1e6;

N=20;
Wn=0.1;
b = fir1(N, Wn); % 默認(rèn)Hamming窗

freqz(b,1,512)

%% pramas
B=floor(b*65536);
B=B';

%% test
t=0:1/fs:1e-3;
s=(mod(t,1e-4)<5e-5)*1.0;

%s_filt=filter(B,1,s)/65536;
for i=1:size(s,2)-N-1
    s_filt(i)=s(i:i+N)*double(B)/65536;
end

figure
subplot(2,1,1)
plot(t,s)
subplot(2,1,2)
plot(t(1:end-N-1),s_filt)

%% 生成.v
filename='FIR_params';
fid=fopen(['./v/',filename,'.v'],'w');

fprintf(fid,['/* ','\n',...
' * file\t\t\t: ',filename,'.v','\n',...
' * author\t\t: 今朝無言','\n',...
' * date\t\t\t: 2023-07-04','\n',...
' * version\t\t: v1.0','\n',...
' * description\t: FIR 濾波器','\n',...
' */','\n']);

fprintf(fid,['module ',filename,'(','\n',...
'output\t[',num2str(size(B,1)*16-1),':0]\tparams\n',...
');\n\n']);

for i=1:size(B,1)
    if(B(i)>=0)
        hex=dec2hex(B(i),4);
    else
        hex=dec2hex(65536+B(i),4);
    end
    fprintf(fid,['assign\t','params[',...
        num2str(i*16-1),':',num2str((i-1)*16),...
        ']\t= 16','''','h',hex,';\n']);
end

fprintf(fid,'\nendmodule\n');

fclose(fid);

??testbench與測試結(jié)果如下

`timescale 1ns/100ps

module FIR_filter_tb();

reg		clk_100M	= 1'b1;
always #5 begin
	clk_100M	<= ~clk_100M;
end

localparam	N = 20;	//FIR濾波器階數(shù)

wire	[16*(N+1)-1:0]	filter_params;
FIR_params_0d1 FIR_params_inst(
	.params		(filter_params)
);

reg				[15:0]	data_in;
wire	signed	[15:0]	data_out;

FIR_filter #(.N(N+1))
FIR_filter_inst2(
	.clk			(clk_100M),
	.filter_params	(filter_params),		//濾波器參數(shù)

	.data_in		(data_in),
	.data_out		(data_out)
);

reg		[7:0]	cnt		= 8'd0;

always @(posedge clk_100M) begin
	cnt		<= cnt + 1'b1;

	if(cnt<100)	begin
		data_in		<= -10000;
	end
	else if(cnt<200)	begin
		data_in		<= 10000;
	end
	else begin
		data_in		<= 0;
	end
end

initial begin
	#10000;
	$stop;
end

endmodule

通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例),數(shù)字邏輯,數(shù)學(xué),fpga開發(fā)

Hilbert 示例

??使用以上 FIR 濾波器代碼,還可以實(shí)現(xiàn)許多其他濾波功能,比如常用的 90 度相移,可以使用 Hilbert 變換實(shí)現(xiàn),Hilbert 濾波器參數(shù)的 matlab 生成代碼如下

%-----------------Hilbert----------------------
clc,clear,close all

%% Hilbert
N=200;

% method 1		這種直接通過 h(n) 表達(dá)式生成的更為精確,推薦
n=(1:floor((N-1)/2));
b1=(1-(-1).^n)./(pi.*n);
if mod(N,2)==0
    b1=[0,b1,0,-b1(end:-1:1)]';
else
    b1=[0,b1,-b1(end:-1:1)]';
end

% method 2		構(gòu)造 Hilbert 的頻域特性,經(jīng) IFFT 獲得
H=[-1j*ones(1,floor((N+1)/2)),1j*ones(1,floor(N/2))];
b2=ifft(H);
b2=real(b2)';

b=b1;

freqz(b,1,100)

%% Filter
fs=1e3;
t=0:1/fs:1;
s=5*sin(2*pi*10*t);
% f >= fs/N 時,可以由很好的90度移相

s2=filter(b,1,s);

figure
hold on
plot(t,s,'r-')
plot(t,s2,'b--')
hold off

%% 量化
B=floor(b*32768);
s3=filter(B,1,s)/32768;

figure
hold on
plot(t,s,'r-')
plot(t,s3,'b--')
hold off

%% 生成params.v
filename='Hilbert_params';
fid=fopen(['./v/',filename,'.v'],'w');

fprintf(fid,['/* ','\n',...
' * file\t\t\t: ',filename,'.v','\n',...
' * author\t\t: 今朝無言','\n',...
' * date\t\t\t: 2023-08-04','\n',...
' * version\t\t: v1.0','\n',...
' * description\t: FIR濾波器參數(shù)(Hilbert)',...
'   N=',num2str(N),'\n',...
' */','\n']);

fprintf(fid,['module ',filename,'(','\n',...
'output\t[',num2str(size(B,1)*16-1),':0]\tparams\n',...
');\n\n']);

for i=1:size(B,1)
    if(B(i)>=0)
        hex=dec2hex(B(i),4);
    else
        hex=dec2hex(65536+B(i),4);
    end
    fprintf(fid,['assign\t','params[',...
        num2str(i*16-1),':',num2str((i-1)*16),...
        ']\t= 16','''','h',hex,';\n']);
end

fprintf(fid,'\nendmodule\n');

fclose(fid);

??仿真結(jié)果如下

通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例),數(shù)字邏輯,數(shù)學(xué),fpga開發(fā)文章來源地址http://www.zghlxwxcb.cn/news/detail-638141.html

到了這里,關(guān)于通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于FPGA的FIR濾波器的實(shí)現(xiàn)(5)— 并行結(jié)構(gòu)FIR濾波器的FPGA代碼實(shí)現(xiàn)

    基于FPGA的FIR濾波器的實(shí)現(xiàn)(5)— 并行結(jié)構(gòu)FIR濾波器的FPGA代碼實(shí)現(xiàn)

    并行結(jié)構(gòu),并行實(shí)現(xiàn)濾波器的累加運(yùn)算,即并行將具有對稱系數(shù)的輸入數(shù)據(jù)進(jìn)行相加,而后采用多個乘法器并行實(shí)現(xiàn)系數(shù)與數(shù)據(jù)的乘法運(yùn)算,最后將所有乘積結(jié)果相加輸出。這種結(jié)構(gòu)具有最高的運(yùn)行速度,因不需要累加運(yùn)算,因此系數(shù)時鐘頻率可以與數(shù)據(jù)輸出時鐘頻率保持一

    2024年02月03日
    瀏覽(31)
  • STM32 FIR實(shí)時數(shù)字濾波器實(shí)現(xiàn)

    STM32 FIR實(shí)時數(shù)字濾波器實(shí)現(xiàn)

    首先是生成不同周期的正弦波: ????????由于定時器設(shè)置為250us進(jìn)入一次中斷,每秒可進(jìn)入中斷4000次,為了生成25HZ的正弦信號,一個周期內(nèi)生成160個數(shù)據(jù);為了生成200HZ的正弦信號,一個周期內(nèi)生成20個數(shù)據(jù),故代碼如下: ?? ?sin_1=arm_sin_f32(3.141592654*i/80)+1;//25HZ 信號 ??

    2024年02月14日
    瀏覽(31)
  • 濾波器設(shè)計(jì):FIR和IIR高、低、帶通濾波器的實(shí)現(xiàn)及Matlab代碼

    濾波器設(shè)計(jì):FIR和IIR高、低、帶通濾波器的實(shí)現(xiàn)及Matlab代碼 引言: 濾波器作為信號處理中非常重要的一部分,廣泛應(yīng)用于數(shù)字信號處理、音頻處理、圖像處理等領(lǐng)域。本文主要討論FIR(有限長沖激響應(yīng))和IIR(無限長沖激響應(yīng))兩種常見濾波器的設(shè)計(jì)及其實(shí)現(xiàn)。 FIR濾波器

    2024年02月09日
    瀏覽(22)
  • FIR內(nèi)插濾波器的FPGA實(shí)現(xiàn)(一)-matlab實(shí)現(xiàn)

    FIR內(nèi)插濾波器的FPGA實(shí)現(xiàn)(一)-matlab實(shí)現(xiàn)

    FIR內(nèi)插濾波器是一種基本的插值方法,主要有兩個步驟: 1)在輸入的每一個初始采樣中間插入L個零點(diǎn); 2)插零后的數(shù)據(jù)經(jīng)過低通濾波器。 運(yùn)行結(jié)果如圖(時域、頻域): 我們的目標(biāo)是把采樣頻率提升五十倍。 得到的頻域圖: 可以看出內(nèi)插零點(diǎn)在頻域會實(shí)現(xiàn)頻譜擴(kuò)展,因此

    2024年02月03日
    瀏覽(23)
  • FIR濾波器的FPGA實(shí)現(xiàn)【IP核實(shí)現(xiàn)版】

    FIR濾波器的FPGA實(shí)現(xiàn)【IP核實(shí)現(xiàn)版】

    本文使用FPGA來實(shí)現(xiàn)FIR濾波器設(shè)計(jì),設(shè)計(jì)中使用的DDS、乘法器與FIR濾波器均采用IP core進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)效果是將3MHz和4MHz的正弦信號混頻后使用FIR低通濾波器濾除7MHz信號得到1MHz的信號。 首先用兩個DDS核生成3MHz以及4MHz的正弦波信號。 注意:此處的dds的命名要和代碼中對應(yīng),系統(tǒng)

    2024年02月04日
    瀏覽(23)
  • 利用FPGA實(shí)現(xiàn)全串行低通FIR濾波器

    利用FPGA實(shí)現(xiàn)全串行低通FIR濾波器

    設(shè)計(jì)一個15階(長度為16)的具有線性相位低通FIR濾波器,采用布拉克曼窗函數(shù)設(shè)計(jì),截止頻率為500HZ,抽樣頻率為2000HZ;采用FPGA實(shí)現(xiàn)全串行FIR濾波器,系數(shù)的量化位數(shù)為12比特,輸入數(shù)據(jù)位數(shù)為12比特,輸出數(shù)據(jù)位數(shù)為29比特,系統(tǒng)時鐘為16KHZ 設(shè)計(jì)思路 :首先采用MATLAB根據(jù)要

    2024年02月07日
    瀏覽(25)
  • 用C語言實(shí)現(xiàn)一個FIR低通濾波器算法

    +v hezkz17進(jìn)數(shù)字音頻系統(tǒng)研究開發(fā)交流答疑? ? 以下是一個基于C語言的FIR低通濾波器算法的實(shí)現(xiàn): #include stdio.h #include stdlib.h #define N 5 ? ? // 濾波器長度 #define M 100 ? // 輸入數(shù)據(jù)長度 double h[N] = {0.2, 0.3, 0.4, 0.1, 0.0}; ?// 濾波器系數(shù) int main() { ? ? double x[M], y[M]; ? ? // 生成輸入信

    2024年02月16日
    瀏覽(26)
  • 解析使用FPGA邏輯實(shí)現(xiàn)FIR濾波器的幾種架構(gòu)

    解析使用FPGA邏輯實(shí)現(xiàn)FIR濾波器的幾種架構(gòu)

    有限脈沖響應(yīng)(finite impulse response,F(xiàn)IR)數(shù)字濾波器 ????????FIR濾波器的實(shí)質(zhì)就是輸入序列與系統(tǒng)脈沖響應(yīng)的卷積,即: ????????其中,N為濾波器的階數(shù),也即抽頭數(shù);x(n)為第n個輸入序列;h(n)為FIR濾波器的第n級抽頭系數(shù)。 ????????FIR濾波器基本結(jié)構(gòu)如下: ?????

    2024年02月08日
    瀏覽(18)
  • 數(shù)字信號處理-10-并行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)

    數(shù)字信號處理-10-并行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)

    本文介紹了設(shè)計(jì)濾波器的FPGA實(shí)現(xiàn)步驟,并結(jié)合杜勇老師的書籍中的并行FIR濾波器部分進(jìn)行一步步實(shí)現(xiàn)硬件設(shè)計(jì),對書中的架構(gòu)做了復(fù)現(xiàn)以及解讀,并進(jìn)行了仿真驗(yàn)證。 FIR濾波器的結(jié)構(gòu)形式時,介紹了直接型、級聯(lián)型、頻率取樣型和快速卷積型4種。在FPGA實(shí)現(xiàn)時,最常用的是最

    2023年04月09日
    瀏覽(37)
  • 串行FIR濾波器

    串行FIR濾波器

    串行設(shè)計(jì),就是在 16 個時鐘周期內(nèi)對 16 個延時數(shù)據(jù)分時依次進(jìn)行乘法、加法運(yùn)算,然后在時鐘驅(qū)動下輸出濾波值??紤]到 FIR 濾波器系數(shù)的對稱性,計(jì)算一個濾波輸出值的周期可以減少到 8 個。串行設(shè)計(jì)時每個周期只進(jìn)行一次乘法運(yùn)算,所以設(shè)計(jì)中只需一個乘法器即可。此時

    2024年02月11日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包