Tengo dos enfoques para hacerlo cuando trabajo en MATLAB.
El primero es generar una onda sinusoidal limpia y luego aplicar una función de distorsión. Por ejemplo, la aplicación de x * (1 + kx ^ 2) para k pequeña a su vector sinusoidal x proporcionaría pequeñas cantidades de armónicos uniformes. Use v ^ 3 para armónicos impares. k = 0 da el vector de señal original, aumente k para una mayor distorsión. Normalmente no calibro lo que hace k, solo lo hago y veo lo que me han dado, y lo adapto a gusto.
El segundo es invertir de forma cuadrada un vector que contiene su especificación de frecuencia. Así que crearías un vector como [dc_val, 1, second_level, tercer nivel, ...], y luego aplicarías ifft para convertirlo en un vector de tiempo. Tenga en cuenta que MATLAB es uno de los pocos idiomas que aún están bloqueados en las edades oscuras de BASIC y FORTRAN mediante el uso de matrices basadas en 1. Esto significa que el término dc es índice 1, término sinusoidal 2, segundo armónico 3, etc.
Tenga en cuenta que el vector de especificación de frecuencia es complejo, por lo que puede obtener una forma de onda de apariencia poco realista si usa coeficientes reales para todos sus armónicos, y todos se suman en la fase del estilo Gibbs. Si eso no es aceptable, el kludge es agregar una fase aleatoria a cada componente de frecuencia antes de la transformación.