summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/pcm2pdm.py1
-rw-r--r--tools/pdm2pcm.py13
-rw-r--r--tools/test_pdm.py91
-rw-r--r--tools/testsignal.py2
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}'.")