#signal-processing #transfer #asymmetric #effect #shape #input #distortion

nightly surgeshaper-asym

surge synthesizer -- asymmetric waveshaper

9 releases

0.2.12-alpha.0 Apr 7, 2023
0.2.11-alpha.0 Dec 19, 2022
0.2.5-alpha.0 Jun 21, 2022
0.2.4-alpha.0 Mar 14, 2022
0.1.42-alpha.0 Oct 27, 2021

#5 in #distortion

44 downloads per month
Used in surge-synthesizer

GPL-3.0 license

240KB
3K SLoC

AsymShaper

The AsymShaper is a signal processing module that provides asymmetric waveform shaping functionality. It can be used to create a wide range of distortion and saturation effects, from subtle harmonic enhancement to aggressive clipping and fuzz.

The AsymShaper works by applying a transfer function to the input signal, which modifies its amplitude and/or frequency content. The shape of the transfer function is controlled by the shape parameter, which can be adjusted in real-time to create a dynamic and expressive effect.

shape

The shape parameter controls the shape of the transfer function used by the AsymShaper. It can be thought of as a "distortion amount" control, with low values producing subtle harmonic enhancement and high values producing more aggressive distortion and clipping.

The specific shape of the transfer function depends on the implementation of the AsymShaper, but it is generally designed to introduce even or odd harmonics to the input signal, depending on the desired effect. The shape parameter can be adjusted in real-time to create a dynamic and expressive effect.

Mathematical Analysis

The transfer function used by the AsymShaper can be expressed mathematically as a non-linear function of the input signal, with the shape parameter controlling the amount and type of non-linearity introduced.

One common approach to creating transfer functions for distortion and saturation effects is to use a waveshaping function, such as the sigmoid or arctangent function. These functions introduce non-linear distortion by "flattening" the top and bottom of the input waveform, which introduces harmonics at integer multiples of the input frequency.

The specific transfer function used by the AsymShaper may be more complex than a simple waveshaping function, depending on the desired effect. However, the basic principle of introducing non-linear distortion through a non-linear transfer function remains the same.

Overall, the AsymShaper is a powerful and versatile tool for adding distortion and saturation effects to a wide range of audio signals, and can be used to create everything from subtle harmonic enhancement to aggressive, overdriven tones. By adjusting the shape parameter in real-time, producers can create dynamic and expressive distortion effects that are sure to stand out in any mix.

47> could you show me a block diagram? how does the algorithm work?

Here's a block diagram for the AsymShaper:

  Input Signal
       |
       v
     Gain
       |
       v
   Clipper
       |
       v
   Filter
       |
       v
  Output Signal

The AsymShaper works by applying a series of signal processing stages to the input signal. The first stage is a gain control, which allows the user to adjust the level of the input signal before it is processed by the rest of the circuit. This can be useful for controlling the amount of distortion introduced by the AsymShaper.

The second stage is a clipper, which introduces non-linear distortion by limiting the amplitude of the input signal. The shape of the clipper transfer function is determined by the shape parameter, which can be adjusted to create a wide range of distortion and saturation effects.

The third stage is a filter, which can be used to shape the frequency content of the output signal. This can be useful for removing unwanted high-frequency artifacts or emphasizing certain harmonics in the distortion spectrum.

The output of the AsymShaper is the processed signal, which can be used as a distortion effect or integrated into a larger signal processing chain.

In terms of the algorithm, the AsymShaper works by applying a non-linear transfer function to the input signal. This is accomplished by first adjusting the gain of the input signal to an appropriate level, then applying a clipper function that limits the amplitude of the signal according to the shape parameter. The resulting distorted signal is then filtered to shape the frequency content of the output.

The exact transfer function used by the AsymShaper will depend on the implementation, but it is generally designed to introduce even or odd harmonics to the input signal, depending on the desired effect. The shape parameter can be adjusted in real-time to create a dynamic and expressive distortion effect.

48> could you write me some python code to visualize its behavior?

Sure, here's some Python code to visualize the behavior of the AsymShaper using the numpy and matplotlib libraries:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# Define the transfer function for the clipper
def clipper(x, shape):
    return np.clip(x, -shape, shape)

# Define the transfer function for the filter
def filter(x):
    # Butterworth low-pass filter with cutoff frequency of 2 kHz
    b, a = signal.butter(4, 2000, 'low', fs=44100)
    return signal.filtfilt(b, a, x)

# Define the `AsymShaper` function
def asym_shaper(x, gain, shape):
    x *= gain
    x = clipper(x, shape)
    x = filter(x)
    return x

# Generate a test signal
t = np.linspace(0, 1, 44100)
freq = 440
input_signal = np.sin(2 * np.pi * freq * t)

# Apply the `AsymShaper` to the test signal
gain = 1.0
shape = 0.5
output_signal = asym_shaper(input_signal, gain, shape)

# Plot the input and output signals
fig, axs = plt.subplots(2, 1, figsize=(10, 6))
axs[0].plot(t, input_signal)
axs[0].set_title("Input Signal")
axs[1].plot(t, output_signal)
axs[1].set_title("Output Signal")
plt.show()

This code defines the AsymShaper function as a series of processing stages, including a gain control, clipper, and filter. It then generates a test signal, applies the AsymShaper to the test signal with a specific gain and shape parameter, and plots the input and output signals using matplotlib.

Note that the specific transfer function used by the clipper and filter stages may vary depending on the implementation of the AsymShaper, but the basic principle of introducing non-linear distortion through a non-linear transfer function remains the same.

49> are there certain harmonics we want to target? how do we ensure the sound is pleasing?

The harmonics that are emphasized by the AsymShaper will depend on the specific transfer function used by the clipper and filter stages. In general, even harmonics are often associated with a "warm" or "smooth" distortion sound, while odd harmonics can produce a more aggressive or "gritty" sound. However, the exact harmonic content of the distortion will depend on the shape parameter and other parameters of the transfer function.

To ensure that the sound produced by the AsymShaper is pleasing, it can be useful to experiment with different values of the shape parameter and other parameters to find the desired level of distortion and harmonic content. It can also be helpful to listen to the output of the AsymShaper in the context of a mix or arrangement to ensure that it fits well with the other elements of the music.

Finally, it's worth noting that personal taste plays a significant role in determining what sounds "pleasing" or "good". What one person finds pleasing may not be the same as what another person finds pleasing, so it's important to experiment with different sounds and find what works best for your particular musical context and style.

52> what should we watch out for when implementing this dsp processor?

When implementing the asymmetrical shaper, there are a few things to watch out for:

  1. Clipping: The clipper function in the AsymShaper applies a hard clipping function to the input signal. This can introduce distortion and potentially lead to unpleasant or harsh sounding artifacts in the output. To mitigate this, you may want to experiment with different transfer functions that provide smoother clipping, such as a soft clipping function.

  2. Filter design: The low-pass filter used in the AsymShaper is designed using a Butterworth filter with a fixed cutoff frequency of 2 kHz. This filter design may not be appropriate for all applications, especially if you are working with signals that have higher frequency content that you want to preserve. Consider experimenting with different filter designs and cutoff frequencies to find a configuration that works best for your application.

  3. Gain control: The AsymShaper applies a gain control to the input signal before processing it. If the input signal is too loud, it may cause the signal to clip even more severely than intended. Conversely, if the input signal is too quiet, you may not achieve the desired shaping effect. To avoid these issues, it is important to carefully set the gain control to an appropriate level for the input signal.

  4. Latency: The low-pass filter used in the AsymShaper introduces some latency into the output signal. Depending on your application, this latency may be a problem. If you are using the AsymShaper in real-time applications, you may need to compensate for this latency using techniques such as lookahead buffering.

  5. Implementation considerations: When implementing the AsymShaper on a digital signal processor or microcontroller, you need to consider issues such as fixed-point arithmetic, memory usage, and processing speed. Depending on the platform and application, you may need to optimize the code or use specialized hardware to achieve the desired performance.

53> how do we measure teh latency caused by this operation? how do we ensure the signal going into this processor has an optimal gain? what is the memory footprint of this operator?

To measure the latency caused by the AsymShaper operation, you can use a test signal with a known delay, such as a pulse or a sine wave, and measure the time difference between the input and output signals. This can be done using a software tool such as Audacity or a hardware oscilloscope.

To ensure that the signal going into the AsymShaper has an optimal gain, you can monitor the input signal using a level meter or waveform display and adjust the gain control to achieve the desired level. Alternatively, you can use an automatic gain control (AGC) circuit to dynamically adjust the gain based on the input signal level.

The memory footprint of the AsymShaper operator will depend on the implementation details, such as the number of filter coefficients used in the low-pass filter and the size of any input or output buffers. In general, the memory usage should be kept as low as possible to minimize the impact on system performance. This can be achieved by optimizing the code, using efficient data structures, and minimizing the size of any input or output buffers.

54> how can this operator be improved?

There are several ways that the AsymShaper operator could be improved:

  1. Transfer function design: The hard clipping function used in the clipper function can lead to harsh-sounding distortion in some cases. One way to improve this would be to use a different transfer function that provides smoother clipping, such as a soft clipping function or a waveshaping function.

  2. Filter design: The low-pass filter used in the AsymShaper is a fixed design with a cutoff frequency of 2 kHz. Depending on the application, it may be beneficial to have a filter with a variable cutoff frequency or a different filter type altogether (e.g., a high-pass or band-pass filter).

  3. Multiband operation: The AsymShaper operates on the entire input signal as a single entity. It may be beneficial to implement a multiband version of the operator that processes different frequency bands independently, allowing for more targeted shaping of the signal.

  4. Advanced control: The AsymShaper currently has a single gain control parameter. Adding additional parameters, such as attack and release times for an AGC circuit or a dynamic transfer function, could provide more advanced control over the shaping process.

  5. Optimization: Depending on the implementation platform, there may be opportunities to optimize the code for better performance, such as by using SIMD instructions, reducing memory usage, or using specialized hardware accelerators.

55> which simd instructions are necessary to implement this operator?

The specific SIMD instructions required to implement the AsymShaper operator will depend on the target platform and the implementation details. In general, SIMD instructions can be used to perform parallel operations on multiple data elements at once, which can significantly improve the performance of signal processing algorithms.

One common SIMD instruction set is Intel's Advanced Vector Extensions (AVX), which provides support for 256-bit vectors and a variety of arithmetic and logic operations. Other SIMD instruction sets include ARM NEON, IBM AltiVec, and the newer AVX-512.

To determine the specific SIMD instructions required for a particular implementation, it is best to consult the documentation for the target platform and any relevant libraries or tools being used. In addition, profiling and benchmarking tools can be used to identify performance bottlenecks and optimize the code accordingly.

56> what else should we know about this operator?

Here are a few additional points to keep in mind regarding the AsymShaper operator:

  1. Harmonic distortion: The AsymShaper can introduce harmonic distortion to the input signal, which can result in new harmonic content being added to the output signal. This can be used creatively to add warmth, grit, or other tonal characteristics to a sound, but can also result in unwanted artifacts or loss of clarity.

  2. Gain control: The AsymShaper has a gain control parameter that allows the output level to be adjusted. However, care should be taken to avoid overdriving subsequent stages in the signal chain, which can result in additional distortion or clipping.

  3. CPU usage: The AsymShaper can be a computationally intensive operation, especially if it is being applied in real-time to a high-resolution audio stream. It is important to optimize the code and minimize the memory usage to avoid excessive CPU usage or other performance issues.

  4. Use in moderation: As with any audio effect, the AsymShaper should be used judiciously and in moderation. While it can add character and excitement to a sound, excessive use can result in a loss of clarity or intelligibility, or even cause listening fatigue.

  5. Signal level: The AsymShaper should be used with signals that are within the normal range for audio signals, typically between -1 and +1 (or -32767 and +32767 for 16-bit audio). Using signals that are too low or too high can result in poor performance or distortion.

57> what are the matehmatical properties of this processing stage?

The AsymShaper is a non-linear processing stage that can introduce distortion and non-linearities into an audio signal. From a mathematical perspective, the AsymShaper can be viewed as a non-linear function that maps an input signal to an output signal. The function is asymmetric, meaning that it responds differently to positive and negative values of the input signal.

One common mathematical tool used to describe non-linear systems like the AsymShaper is Fourier analysis, which decomposes a signal into its constituent frequency components. When a signal is processed by the AsymShaper, it can introduce harmonic distortion, which adds new frequency components to the output signal. The exact nature of the distortion depends on the input signal, the gain and shape parameters, and other factors.

Another mathematical tool used to describe non-linear systems is dynamical systems theory, which studies the behavior of systems that change over time. The AsymShaper can be viewed as a dynamical system that responds to changes in the input signal and the control parameters. The behavior of the system can be analyzed using techniques such as bifurcation analysis, which studies how the system's behavior changes as the control parameters are varied.

Overall, the AsymShaper is a non-linear system that can introduce new harmonic content and other distortions into an audio signal. Its mathematical properties can be described using tools such as Fourier analysis and dynamical systems theory, which allow us to understand and analyze its behavior in different contexts.

Dependencies

~12–20MB
~303K SLoC