added IO and datatypes WAV file and midas blu file format
This commit is contained in:
parent
aeccbbdcae
commit
7c1313a210
|
|
@ -559,6 +559,103 @@ class Recording:
|
|||
|
||||
to_npy(recording=self, filename=filename, path=path, overwrite=overwrite)
|
||||
|
||||
def to_wav(
|
||||
self,
|
||||
filename: Optional[str] = None,
|
||||
path: Optional[os.PathLike | str] = None,
|
||||
target_sample_rate: Optional[int] = 48000,
|
||||
bits_per_sample: int = 32,
|
||||
overwrite: bool = False,
|
||||
) -> str:
|
||||
"""Write recording to WAV file with embedded YAML metadata.
|
||||
|
||||
WAV format uses stereo audio with I (in-phase) in left channel and Q (quadrature) in right channel.
|
||||
Metadata is stored in standard LIST INFO chunks with RF-specific metadata encoded as YAML
|
||||
in the ICMT (comment) field for human readability.
|
||||
|
||||
:param filename: The name of the file where the recording is to be saved. Defaults to auto generated filename.
|
||||
:type filename: os.PathLike or str, optional
|
||||
:param path: The directory path to where the recording is to be saved. Defaults to recordings/.
|
||||
:type path: os.PathLike or str, optional
|
||||
:param target_sample_rate: Sample rate stored in the WAV header when no sample_rate metadata
|
||||
is present. IQ samples are written without decimation or interpolation. Default is 48000 Hz.
|
||||
:type target_sample_rate: int, optional
|
||||
:param bits_per_sample: Bits per sample (32 for float32, 16 for int16). Default is 32.
|
||||
:type bits_per_sample: int, optional
|
||||
:param overwrite: Whether to overwrite existing files. Default is False.
|
||||
:type overwrite: bool, optional
|
||||
|
||||
:raises IOError: If there is an issue encountered during the file writing process.
|
||||
|
||||
:return: Path where the file was saved.
|
||||
:rtype: str
|
||||
|
||||
**Examples:**
|
||||
|
||||
Create a recording and save it to a .wav file:
|
||||
|
||||
>>> import numpy
|
||||
>>> from utils.data import Recording
|
||||
>>> samples = numpy.exp(1j * 2 * numpy.pi * 0.1 * numpy.arange(10000))
|
||||
>>> metadata = {"sample_rate": 1e6, "center_frequency": 915e6}
|
||||
>>> recording = Recording(data=samples, metadata=metadata)
|
||||
>>> recording.to_wav()
|
||||
"""
|
||||
from utils.io.recording import to_wav
|
||||
|
||||
return to_wav(
|
||||
recording=self,
|
||||
filename=filename,
|
||||
path=path,
|
||||
target_sample_rate=target_sample_rate,
|
||||
bits_per_sample=bits_per_sample,
|
||||
overwrite=overwrite,
|
||||
)
|
||||
|
||||
def to_blue(
|
||||
self,
|
||||
filename: Optional[str] = None,
|
||||
path: Optional[os.PathLike | str] = None,
|
||||
data_format: str = "CI",
|
||||
overwrite: bool = False,
|
||||
) -> str:
|
||||
"""Write recording to MIDAS Blue file format.
|
||||
|
||||
MIDAS Blue is a legacy RF file format with a 512-byte binary header.
|
||||
Commonly used with X-Midas and other RF/radar signal processing tools.
|
||||
|
||||
:param filename: The name of the file where the recording is to be saved. Defaults to auto generated filename.
|
||||
:type filename: os.PathLike or str, optional
|
||||
:param path: The directory path to where the recording is to be saved. Defaults to recordings/.
|
||||
:type path: os.PathLike or str, optional
|
||||
:param data_format: Format code (default 'CI' = complex int16).
|
||||
Common formats: 'CI' (complex int16), 'CF' (complex float32), 'CD' (complex float64).
|
||||
Integer formats require the IQ samples to already be scaled within [-1, 1).
|
||||
:type data_format: str, optional
|
||||
:param overwrite: Whether to overwrite existing files. Default is False.
|
||||
:type overwrite: bool, optional
|
||||
|
||||
:raises IOError: If there is an issue encountered during the file writing process.
|
||||
|
||||
:return: Path where the file was saved.
|
||||
:rtype: str
|
||||
|
||||
**Examples:**
|
||||
|
||||
Create a recording and save it to a .blue file:
|
||||
|
||||
>>> import numpy
|
||||
>>> from utils.data import Recording
|
||||
>>> samples = numpy.ones(10000, dtype=numpy.complex64)
|
||||
>>> metadata = {"sample_rate": 1e6, "center_frequency": 2.44e9}
|
||||
>>> recording = Recording(data=samples, metadata=metadata)
|
||||
>>> recording.to_blue()
|
||||
"""
|
||||
from utils.io.recording import to_blue
|
||||
|
||||
return to_blue(recording=self, filename=filename, path=path, data_format=data_format, overwrite=overwrite)
|
||||
|
||||
|
||||
def trim(self, num_samples: int, start_sample: Optional[int] = 0) -> Recording:
|
||||
"""Trim Recording samples to a desired length, shifting annotations to maintain alignment.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,3 +2,37 @@
|
|||
The IO package contains utilities for input and output operations, such as loading and saving recordings to and from
|
||||
file.
|
||||
"""
|
||||
|
||||
__all__ = [
|
||||
# Common:
|
||||
"exists",
|
||||
"copy",
|
||||
"move",
|
||||
"validate",
|
||||
# Recording:
|
||||
"save_recording",
|
||||
"load_recording",
|
||||
"to_sigmf",
|
||||
"from_sigmf",
|
||||
"to_npy",
|
||||
"from_npy",
|
||||
"from_npy_legacy",
|
||||
"to_wav",
|
||||
"from_wav",
|
||||
"to_blue",
|
||||
"from_blue",
|
||||
]
|
||||
|
||||
from .common import copy, exists, move, validate
|
||||
from .recording import (
|
||||
from_blue,
|
||||
from_npy,
|
||||
from_npy_legacy,
|
||||
from_sigmf,
|
||||
from_wav,
|
||||
load_recording,
|
||||
to_blue,
|
||||
to_npy,
|
||||
to_sigmf,
|
||||
to_wav,
|
||||
)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user