diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/pcm2pdm.py | 1 | ||||
-rw-r--r-- | tools/pdm2pcm.py | 13 | ||||
-rw-r--r-- | tools/test_pdm.py | 91 | ||||
-rw-r--r-- | tools/testsignal.py | 2 |
4 files changed, 98 insertions, 9 deletions
diff --git a/tools/pcm2pdm.py b/tools/pcm2pdm.py index f04f2ba..3a1fac6 100644 --- a/tools/pcm2pdm.py +++ b/tools/pcm2pdm.py @@ -69,6 +69,7 @@ def main(): with open(out_path, 'wb') as f: save_pdm_bin(pdm_data, f) + print('Wrote', out_path) if __name__ == '__main__': main() diff --git a/tools/pdm2pcm.py b/tools/pdm2pcm.py index 15b86ce..b333a6f 100644 --- a/tools/pdm2pcm.py +++ b/tools/pdm2pcm.py @@ -9,7 +9,8 @@ def load_pdm_file(filename): byte_data = np.frombuffer(f.read(), dtype=np.uint8) bit_data = np.unpackbits(byte_data) # Convert to +1 (for 1s) and -1 (for 0s) - pdm_signal = 2 * bit_data - 1 + #pdm_signal = 2 * bit_data - 1 + pdm_signal = bit_data return pdm_signal def pdm_to_pcm(pdm_signal, decimation_factor=64): @@ -36,15 +37,11 @@ def main(): pcm_data = np.expand_dims(pcm_data, axis=1) #print(pcm_data.shape) - print(numpy.min(pcm_data), numpy.max(pcm_data), numpy.mean(pcm_data)) - - # Normalize - pcm_data -= 128.0 - pcm_data = 2**13 * (pcm_data / np.max(np.abs(pcm_data))) - - print(numpy.min(pcm_data), numpy.max(pcm_data), numpy.mean(pcm_data)) + pcm_data -= numpy.mean(pcm_data) # remove DC offset + print(numpy.min(pcm_data), numpy.max(pcm_data), numpy.mean(pcm_data), pcm_data.dtype) soundfile.write(out_path, pcm_data, samplerate) + print('Wrote', out_path) if __name__ == '__main__': main() diff --git a/tools/test_pdm.py b/tools/test_pdm.py new file mode 100644 index 0000000..3bac00b --- /dev/null +++ b/tools/test_pdm.py @@ -0,0 +1,91 @@ + +import numpy +import soundfile +import numpy as np +import matplotlib.pyplot as plt + +from pcm2pdm import convert, convert_file, save_pdm_bin +from pdm2pcm import pdm_to_pcm, load_pdm_file +from testsignal import generate_test_tone + +def plot_reconstruct(pcm_in, pdm, pcm_reconstructed, sr, aspect = 4.0, height = 3.0): + # --- Plotting using OO API --- + + width = height * aspect + figheight = height * 3 + fig, axs = plt.subplots(3, 1, figsize=(width, figheight), sharex=True) + + duration = pcm_in.shape[0] / sr + print(duration) + t = np.linspace(0, duration, int(sr * duration), endpoint=False) + + # Plot original PCM + axs[0].plot(t, pcm_in, label="PCM_in", color='blue') + axs[0].set_title("Original PCM") + axs[0].set_ylabel("Amplitude") + axs[0].set_ylim(-1.2, 1.2) + axs[0].grid(True) + + # Plot PDM bitstream + time_pdm = np.linspace(0, duration, len(pdm), endpoint=False) + axs[1].step(time_pdm, pdm, where='mid', color='black') + axs[1].set_title("PDM Bitstream") + axs[1].set_ylabel("Bit") + axs[1].set_ylim(-0.2, 1.2) + axs[1].grid(True) + + # Plot reconstructed PCM + axs[2].plot(t, pcm_reconstructed[:len(t)], label="PCM_rec", color='green') + axs[2].set_title("Reconstructed PCM") + axs[2].set_ylabel("Amplitude") + axs[2].set_xlabel("Time [s]") + axs[2].set_ylim(-1.2, 1.2) + axs[2].grid(True) + + fig.tight_layout() + return fig + +def test_sine(): + + # temp files + pcm_file = 'test.wav' + pdm_file = 'test.pdm' + + # Generate test data + oversample = 32 + sample_rate = 16000 + signal = generate_test_tone(sample_rate=sample_rate, + duration_sec=1.000, freqs=[1000.0], noise_level=0.0) + pcm = signal + soundfile.write(pcm_file, signal, sample_rate) + + # Convert to PDM + + pdm_data = convert_file(pcm_file, oversample=oversample) + with open(pdm_file, 'wb') as f: + save_pdm_bin(pdm_data, f) + + pdm_loaded = load_pdm_file(pdm_file) + + numpy.testing.assert_equal(pdm_loaded, pdm_data) + + print(pdm_data) + print(pdm_loaded) + + # PDM to PCM conversion + pcm_reconstructed = pdm_to_pcm(pdm_loaded, decimation_factor=oversample) + + # Remove DC offset + pcm_reconstructed -= numpy.mean(pcm_reconstructed) + + fig = plot_reconstruct(pcm, pdm_loaded, pcm_reconstructed, sr=sample_rate) + print(fig.axes) + offset = 0.2 + fig.axes[0].set_xlim(offset+0.0010,offset+0.0020) + + plot_path = 'test.png' + fig.savefig(plot_path) + print(f'Saved {plot_path}') + +if __name__ == '__main__': + test_sine() diff --git a/tools/testsignal.py b/tools/testsignal.py index fb8c599..17bbacd 100644 --- a/tools/testsignal.py +++ b/tools/testsignal.py @@ -31,7 +31,7 @@ if __name__ == "__main__": sample_rate = 16000 - signal = generate_test_tone(sample_rate=sample_rate, freqs=[1000.0], noise_level=0.0) + signal = generate_test_tone(sample_rate=sample_rate, freqs=[1000.0, 440.0], noise_level=0.01) sf.write(filename, signal, sample_rate) print(f"Saved test tone to '{filename}'.") |