He estado tratando de hacer algunos efectos de audio simples utilizando DE1 Altera FPGA, usando Verilog HDL. Lo primero que quise hacer es eliminar el ruido de la entrada promediando las últimas 2 ^ N entradas. Esto solo parece estar agregando ruido a mi salida de sonido. Cuando hago una suma simple de las últimas 2 ^ N señales, el sonido de salida está bien.
¿Alguien tiene idea de por qué sucedería algo como esto?
Para una mejor referencia, este es parte del código que promedia:
module noise_filter
#(
parameter DATA_WIDTH=24,
parameter N = 3
)
(
input write,
input clock,
input [DATA_WIDTH-1:0] data_in,
output done,
output [DATA_WIDTH-1:0] sum
);
reg [DATA_WIDTH+N-1:0] summed;
reg [N-1:0] counter;
reg isDone;
reg [DATA_WIDTH-1:0] fifo [0:2**N-1];
integer i;
initial
begin
counter = 0;
summed = 0;
isDone = 0;
for(i = 0; i < 2**N; i= i+1)
begin
fifo[i] = 0;
end
end
always @(posedge clock)
begin
if(isDone == 1)
begin
isDone <= 0;
end
else if(write == 1)
begin
counter <= counter + 1;
fifo[counter] <= data_in;
summed <= summed - {{N{1'b0}}, fifo[counter]} + {{N{1'b0}}, data_in};
isDone <= 1;
end
end
assign sum = summed[DATA_WIDTH+N-1:N];
assign done = isDone;
endmodule
Y así sería como lo conecté al códec de audio
noise_filter nf (
.write(read_ready),
.clock(CLOCK_50),
.data_in(readdata_right),
.done(filter_done),
.sum(data_filtered)
);
//////
// Audio CODEC interface.
//
// The interface consists of the following wires:
// read_ready, write_ready - CODEC ready for read/write operation
// readdata_left, readdata_right - left and right channel data from the CODEC
// read - send data from the CODEC (both channels)
// writedata_left, writedata_right - left and right channel data to the CODEC
always @(posedge CLOCK_50)
begin
if(filter_done == 1)
begin
used <= 0;
end
if(write == 1)
begin
used <= 1;
end
end
assign writedata_left = data_filtered;
assign writedata_right = data_filtered;
assign read = filter_done;
assign write = write_ready && used == 0;
El manual sobre cómo se deben utilizar las señales de códec de audio:
El primer elemento del búfer siempre está visible en los datos leídos a la izquierda y readdata right emite cuando se valida la señal de lectura lista. El siguiente elemento se puede leer mediante la afirmación de la la señal de lectura, que expulsa la muestra actual y aparece una nueva o más ciclos de reloj más tarde, si están listos para leer se afirma la señal. Para emitir sonido a través de los altavoces se sigue un procedimiento similar. Tu circuito debe observar la escriba la señal de listo, y si se afirma, escriba una muestra en el CODEC de audio proporcionándolo a la izquierda writedata y writedata las entradas correctas y afirmando la señal de escritura. Esta operación almacena una muestra en un búfer dentro de la Interfaz de CODEC de audio, que luego enviará la muestra a los altavoces en el momento adecuado.