El filtrado de ruido agrega ruido

0

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.

    
pregunta Milan Stefanovic

0 respuestas

Lea otras preguntas en las etiquetas