¿Cómo agregar ruido gaussiano o cualquier otro ruido a una onda sinusoidal (usando VHDL)?

1

Necesitamos una señal de onda sinusoidal ruidosa. Hemos generado la onda sinusoidal (usando VHDL), pero no podemos averiguar cómo agregarle ruido. Estamos incluyendo el código para la generación de onda sinusoidal. Por favor mencione cómo agregar Gaussian o cualquier otro ruido.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;  --try to use this library as much as possible.

entity sine_wave is
port (clk :in  std_logic;
      data_out : out STD_LOGIC_VECTOR(7 downto 0)
      );
end sine_wave;

architecture Behavioral of sine_wave is
signal i : integer range 0 to 29:=0;
--type memory_type is array (0 to 29) of integer;
type memory_type is array (0 to 29) of std_logic_vector(7 downto 0); 
--ROM for storing the sine values generated by MATLAB.
signal sine : memory_type :=("01001101","01011101","01101100","01111010","10000111","10010000","10010111","10011010","10011010","10010111","10010000","10000111","01111010","01101100","01011101","01001101",
"00111101","00101110","00100000","00010011","00001010","00000011","00000000","00000000","00000011","00001010","00010011","00100000","00101110","00111101");
--hi
begin

process(clk)
begin
  --to check the rising edge of the clock signal
if(rising_edge(clk)) then     
data_out <= sine(i);
i <= i+ 1;
if(i = 29) then
i <= 0;
end if;
end if;
end process;

end Behavioral;

    
pregunta Anwesa Roy

2 respuestas

1

Dependiendo del propósito del ruido hay diferentes posibilidades. Ya he usado uno que consiste en agregar un porcentaje de aleatoriedad a la forma de onda generada.

Primero necesitas agregar la biblioteca IEEE.MATH_REAL.ALL . A continuación, utilice el procedimiento uniforme:

procedure UNIFORM (variable Seed1,Seed2:inout integer; variable X:out real);
    -- returns a pseudo-random number with uniform distribution in the 
    -- interval (0.0, 1.0).
    -- Before the first call to UNIFORM, the seed values (Seed1, Seed2) must
    -- be initialized to values in the range [1, 2147483562] and 
    -- [1, 2147483398] respectively.  The seed values are modified after 
    -- each call to UNIFORM.
    -- This random number generator is portable for 32-bit computers, and
    -- it has period ~2.30584*(10**18) for each set of seed values.

Por ejemplo, puedes crear tu proceso de comportamiento de esta manera:

---------------------------------------
-- generates rdm numbers to simulate 
-- noise on the line
---------------------------------------
rdm : PROCESS
    VARIABLE seed1, seed2: positive;            
    VARIABLE rand: real;  
    VARIABLE rdm_rng : real := 419430.0; 
    VARIABLE rand_num_i : integer := 0;
BEGIN
    uniform(seed1, seed2, rand);
    rand_num_i  := integer(rand*rdm_rng) - 104858; -- rescaling
    rand_num <= to_signed(rand_num_i, 24);
    WAIT FOR tempo;
END PROCESS;

Finalmente, solo necesitas agregar rand_num a tu señal.

    
respondido por el A. Kieffer
0

Debería ser bastante sencillo implementar algo como esto enlace

Una secuencia seudoaleatoria tiene todas las propiedades estadísticas y cualidades espectrales del ruido blanco gaussiano del mundo real, excepto que tiene una función de correlación automática que es un delta de Kronecker para un solo punto de la secuencia. (secuencia de longitud máxima)

    
respondido por el N.G. near

Lea otras preguntas en las etiquetas