Source code for aspen.processings.extract_envelope
#!/usr/bin/env python3
# encoding: utf-8
"""Extract envelope"""
import numpy as np
from scipy import signal
from aspen.interfaces.abs_common_interface import AbsCommonInterface
from aspen.interfaces.abs_processing_interface import AbsProcessingInterface
from aspen.processings.filter_signal import filter_signal
[docs]class ExtractEnvelope(AbsCommonInterface, AbsProcessingInterface):
"""Extract the envelope from a signal
Args:
extract_envelope_method: Extracting method of envelope.
Defaults to "rect".
extract_envelope_lpf_freq: Frequency of low-pass filter.
Defaults to 16.0.
extract_envelope_lpf_impulse_response: Impulse response for low-pass filter.
Defaults to "fir".
extract_envelope_lpf_filter_order: Filter order of low-pass filter.
Defaults to 512.
extract_envelope_lpf_fir_window: Window function for low-pass filter.
Use only when `lpf-impulse-response=fir`. Defaults to "hann".
samp_freq: Sampling frequency. Defaults to 16000.
"""
def __init__(
self,
extract_envelope_method: str = "rect",
extract_envelope_lpf_freq: float = 16.0,
extract_envelope_lpf_impulse_response: str = "fir",
extract_envelope_lpf_filter_order: int = 512,
extract_envelope_lpf_fir_window: str = "hann",
samp_freq: int = 16000,
):
self.method = extract_envelope_method
self.lpf_freq = extract_envelope_lpf_freq
self.lpf_impulse_response = extract_envelope_lpf_impulse_response
self.lpf_filter_order = extract_envelope_lpf_filter_order
self.lpf_fir_window = extract_envelope_lpf_fir_window
self.samp_freq = samp_freq
[docs] @staticmethod
def add_arguments(parser):
group = parser.add_argument_group("extract-envelope setting")
group.add_argument(
"--extract-envelope-method",
default="rect",
choices=["hilbert", "rect"],
type=str,
help="Extracting method of envelope",
)
group.add_argument(
"--extract-envelope-lpf-freq",
default=16,
type=float,
help="Frequency of low-pass filter",
)
group.add_argument(
"--extract-envelope-lpf-impulse-response",
default="fir",
choices=["fir", "iir"],
type=str,
help="Impulse response for low-pass filter",
)
group.add_argument(
"--extract-envelope-lpf-filter-order",
default=512,
type=int,
help="Filter order of low-pass filter",
)
group.add_argument(
"--extract-envelope-lpf-fir-window",
default="hann",
type=str,
help="Window function for low-pass filter. Use only when lpf-impulse-response=fir",
)
return parser
[docs] def __call__(self, x: np.ndarray) -> np.ndarray:
"""Apply envelope extracting
Args:
x: Input signal
Returns:
Output signal
"""
if self.method == "hilbert":
half = np.abs(signal.hilbert(x))
elif self.method == "rect":
half = np.where(x < 0, 0, x)
else:
raise ValueError("Invalid extract_envelope method %s" % self.method)
env = filter_signal(
half,
"lowpass",
self.lpf_freq,
self.lpf_impulse_response,
self.lpf_filter_order,
self.lpf_fir_window,
self.samp_freq,
)
return env
[docs]def extract_envelope(
x: np.ndarray,
method: str = "rect",
lpf_freq: float = 16,
lpf_impulse_response: str = "fir",
lpf_filter_order: int = 512,
lpf_fir_window: str = "hann",
samp_freq: int = 16000,
) -> np.ndarray:
"""Extract the envelope from a signal
Args:
x: Input signal
method: Extracting method of envelope.
Defaults to "rect".
lpf_freq: Frequency of low-pass filter.
Defaults to 16.0.
lpf_impulse_response: Impulse response for low-pass filter.
Defaults to "fir".
lpf_filter_order: Filter order of low-pass filter.
Defaults to 512.
lpf_fir_window: Window function for low-pass filter.
Use only when `lpf-impulse-response=fir`. Defaults to "hann".
samp_freq: Sampling frequency. Defaults to 16000.
Returns:
Output signal
"""
return ExtractEnvelope(
method,
lpf_freq,
lpf_impulse_response,
lpf_filter_order,
lpf_fir_window,
samp_freq,
)(x)