1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
.. _examples:
Monophonic resampling
=====================
The following code block demonstrates how to resample an audio signal.
We use `librosa <https://librosa.org/>`_ for loading the audio,
but this is purely for ease of demonstration. `resampy` does not depend on `librosa`.
.. code-block:: python
:linenos:
import librosa
import resampy
# Load in librosa's example audio file at its native sampling rate
x, sr_orig = librosa.load(librosa.ex('trumpet'), sr=None)
# x is now a 1-d numpy array, with `sr_orig` audio samples per second
# We can resample this to any sampling rate we like, say 16000 Hz
y_low = resampy.resample(x, sr_orig, 16000)
# That's it!
Stereo and multi-dimensional data
=================================
The previous example operates on monophonic signals, but resampy also supports stereo
resampling, as demonstrated below.
.. code-block:: python
:linenos:
import librosa
import resampy
# Load in librosa's example audio file at its native sampling rate.
# This time, also disable the stereo->mono downmixing
x, sr_orig = librosa.load(librosa.ex('trumpet', hq=True), sr=None, mono=False)
# x is now a 2-d numpy array, with `sr_orig` audio samples per second
# The first dimension of x indexes the channels, the second dimension indexes
# samples.
# x[0] is the left channel, x[1] is the right channel.
# We can again resample. By default, resample assumes the last index is time.
y_low = resampy.resample(x, sr_orig, 16000)
# To be more explicit, provide a target axis
y_low = resampy.resample(x, sr_orig, 16000, axis=1)
The next block illustrates resampling along an arbitrary dimension.
.. code-block:: python
:linenos:
import numpy as np
import resampy
# Generate 4-dimensional white noise. The third axis (axis=2) will index time.
sr_orig = 22050
x = np.random.randn(10, 3, sr_orig * 5, 2)
# x is now a 10-by-3-by-(5*22050)-by-2 tensor of data.
# We can resample along the time axis as follows
y_low = resampy.resample(x, sr_orig, 11025, axis=2)
# y_low is now a 10-by-3-(5*11025)-by-2 tensor of data
Integer-valued samples
======================
Integer-valued inputs are supported, but because resampy interpolates between
sample values, it will always produce a floating-point output.
If you really need integer-valued outputs after resampling, you'll have to cast the
output array as demonstrated below.
.. code-block:: python
:linenos:
import numpy as np
import resampy
sr_orig = 22050
# Create 5 seconds of random integer noise
x = np.random.randint(-32768, high=32767, size=5*sr_orig, dtype=np.int16)
# resample, y will be floating-point type
y = resampy.resample(x, sr_orig, 11025)
# Cast back to match x's dtype
y_int = y.astype(x.dtype)
Advanced filtering
==================
resampy allows you to control the design of the filters used in resampling operations.
.. code-block:: python
:linenos:
import numpy as np
import scipy.signal
import librosa
import resampy
# Load in some audio
x, sr_orig = librosa.load(librosa.ex('trumpet'), sr=None, mono=False)
# Resample to 22050Hz using a Hann-windowed sinc-filter
y = resampy.resample(x, sr_orig, sr_new, filter='sinc_window', window=scipy.signal.windows.hann)
# Or a shorter sinc-filter than the default (num_zeros=64)
y = resampy.resample(x, sr_orig, sr_new, filter='sinc_window', num_zeros=32)
# Or use the pre-built high-quality filter
y = resampy.resample(x, sr_orig, sr_new, filter='kaiser_best')
# Or use the pre-built fast filter
y = resampy.resample(x, sr_orig, sr_new, filter='kaiser_fast')
|