forked from jiaaro/pydub
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add scipy-powered filters and bump version
- Loading branch information
Showing
3 changed files
with
77 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
""" | ||
This module provides scipy versions of high_pass_filter, and low_pass_filter | ||
as well as an additional band_pass_filter. | ||
Of course, you will need to install scipy for these to work. | ||
When this module is imported the high and low pass filters are used when calling | ||
audio_segment.high_pass_filter() and audio_segment.high_pass_filter() instead | ||
of the slower, less powerful versions provided by pydub.effects. | ||
""" | ||
from scipy.signal import butter, sosfilt | ||
from .utils import register_pydub_effect | ||
|
||
|
||
def _mk_butter_filter(freq, type, order): | ||
""" | ||
Args: | ||
freq: The cutoff frequency for highpass and lowpass filters. For | ||
band filters, a list of [low_cutoff, high_cutoff] | ||
type: "lowpass", "highpass", or "band" | ||
order: nth order butterworth filter (default: 5th order) | ||
Returns: | ||
function which can filter a mono audio segment | ||
""" | ||
def filter_fn(seg): | ||
assert seg.channels == 1 | ||
|
||
nyq = 0.5 * seg.frame_rate | ||
try: | ||
freqs = [f / nyq for f in freq] | ||
except TypeError: | ||
freqs = freq / nyq | ||
|
||
sos = butter(order, freqs, btype=type, output='sos') | ||
y = sosfilt(sos, seg.get_array_of_samples()) | ||
|
||
return seg._spawn(y.astype(seg.array_type).tostring()) | ||
|
||
return filter_fn | ||
|
||
|
||
@register_pydub_effect | ||
def band_pass_filter(seg, low_cutoff_freq, high_cutoff_freq, order=5): | ||
filter_fn = _mk_butter_filter([low_cutoff_freq, high_cutoff_freq], 'band', order=order) | ||
return seg.apply_mono_filter_to_each_channel(filter_fn) | ||
|
||
|
||
@register_pydub_effect | ||
def high_pass_filter(seg, cutoff_freq, order=5): | ||
filter_fn = _mk_butter_filter(cutoff_freq, 'highpass', order=order) | ||
return seg.apply_mono_filter_to_each_channel(filter_fn) | ||
|
||
|
||
@register_pydub_effect | ||
def low_pass_filter(seg, cutoff_freq, order=5): | ||
filter_fn = _mk_butter_filter(cutoff_freq, 'lowpass', order=order) | ||
return seg.apply_mono_filter_to_each_channel(filter_fn) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters