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