FPGA SDR(31)ディエンファシス


FM変調時に強調された高音を元に戻すディエンファシスを追加しました。時定数50usのアナログフィルタと同じ特性のデジタルフィルタを用意します。ディジタルフィルタってなんだろうで勉強させていただきました。

時定数50us、サンプリング周波数48kHzなので、
y[n] = 0.7058823529411764 * y[n-1] + 0.2941176470588236 * x[n]
になりました。

`timescale 1ns/1ns


module MyDeEmphasis
#(
	parameter DATA_WIDTH = 10
)
(
	input wire clk,
	input wire reset_n,
	
	input wire signed [DATA_WIDTH-1:0] in_data,
	input wire in_valid,

	output reg signed [DATA_WIDTH-1:0] out_data,
	output wire out_valid
);

	
	always @(posedge clk)
	begin
		if (~reset_n) begin			
			out_data <= 0;
		end
		else begin
			
			if (in_valid) begin
				// y[n] = 0.7058823529411764 * y[n-1] + 0.2941176470588236 * x[n]
					  // 0 . 1011 0100 1011 0100 1011 0100 * y[n-1]
				out_data <= (out_data >>> 1)
					  + (out_data >>> 3)
					  + (out_data >>> 4)
					  + (out_data >>> 6)
					  + (out_data >>> 9)
					  // + 0 . 0100 1011 0100 1011 0100 1011 * x[n]
					  + (in_data >>> 2)
					  + (in_data >>> 5)
					  + (in_data >>> 7)
					  + (in_data >>> 8)
					  + (in_data >>> 10);
			end
			
		end
	end
	assign out_valid = in_valid;


endmodule

TOPモジュールに追加します。

`define CYCLE_1SEC 50000000


module SPIbridge
(
	...
);
...
	wire signed [FIR_WIDTH-1:0] freq_L;
	wire signed [FIR_WIDTH-1:0] freq_R;
	wire signed [FIR_WIDTH-1:0] freq_LD;
	wire signed [FIR_WIDTH-1:0] freq_RD;
...	
	assign freq_L = freq_LPR + freq_LMR;
	assign freq_R = freq_LPR - freq_LMR;

	MyDeEmphasis #(.DATA_WIDTH(FIR_WIDTH)) MyDeEmphasis_L_inst (
		.clk (clk),
		.reset_n (RST_N),
		.in_data (freq_L),
		.in_valid (ifir_valid),
		.out_data (freq_LD),
		.out_valid ()
	);

	MyDeEmphasis #(.DATA_WIDTH(FIR_WIDTH)) MyDeEmphasis_R_inst (
		.clk (clk),
		.reset_n (RST_N),
		.in_data (freq_R),
		.in_valid (ifir_valid),
		.out_data (freq_RD),
		.out_valid ()
	);
...
	MyI2S #(.IN_WIDTH(FIR_WIDTH)) MyI2S_inst (
		.clk (clk),
		.reset_n (RST_N),	
		.volume (4'b1111 - volume),
		.in_left (fm ? freq_LD : mag - mag_dc),
		.in_right (fm ? freq_RD : mag - mag_dc),
		.in_valid (freq_LPR_valid),
		.SCK (I2S_SCK),
		.BCK (I2S_BCK),
		.LRCK (I2S_LRCK),
		.DATA (I2S_DATA)
	);
...
endmodule