import pyfar as pf
import numpy as np
signal = pf.FrequencyData(
    10**(np.arange(-20, 21)/20), np.arange(0, 41))
for knee in ['arctan', 20, 0]:
    limited = pf.dsp.soft_limit_spectrum(signal, 0, knee)
    pf.plot.freq(limited, freq_scale='linear', label=f'{knee=}')
ax = pf.plot.freq(signal, freq_scale='linear',
                  linestyle='--', label='input')
ax.legend(loc='upper left')
ax.set_xlim(0, 40)
ax.set_ylim(-20, 20)
bbox=dict(facecolor='white', edgecolor='none', alpha=0.5)
arrowprops= dict(
    arrowstyle="<->", shrinkA=0, shrinkB=0,
    color=pf.plot.color('r'))
ax.annotate("limit=0 dB", (20, 0), (10, 0), bbox=bbox,
            arrowprops=dict(arrowstyle="->"), va='center')
ax.text(20, -14, 'knee=20 dB', ha='center',
        color=pf.plot.color('r'), bbox=bbox)
ax.annotate("", (10, -15), (30, -15), arrowprops=arrowprops)
