예제 #1
0
def exercise_02():
    filename = 'lab01/som_8_16_mono.wav'
    print('2.    Reading sound file: {}'.format(filename))
    fs, m = wav.read(filename)

    vmax = q.vmax(m)
    r = np.array([3, 5, 8])
    snr = np.arange(len(r), dtype='float')

    for i in range(len(r)):
        delta_q = q.delta_q(vmax, r[i])
        vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
        mq, idx = q.quantize(m, vmax, vj, tj)

        filename = 'lab02/som_8_16_quantize_{}bits.wav'.format(r[i])
        print('2.    r = {} [quantize]; Writing sound file {}'.format(
            r[i], filename))
        wav.write(filename, fs, mq.astype('int16'))

        bin = c.pcm_encode(idx, r[i])
        dec = c.pcm_decode(bin)

        filename = 'lab02/som_8_16_quantize_encode_decode_dequantize_{}bits.wav'.format(
            r[i])
        print(
            '2.    r = {} [quantize > encode > decode > dequantize]; Writing sound file {}'
            .format(r[i], filename))
        wav.write(filename, fs, q.dequantize(vj, dec).astype('int16'))

        p = np.sum(m * m) / len(m)
        snr[i] = lib.metrics.snr_theoric(r[i], p, vmax)

        print('2.    r = {:d}; SNR = {:>7.3f}'.format(r[i], snr[i]))
예제 #2
0
def exercise_05():
    # a)
    fs, x = wav.read("som_8_16_mono.wav")

    plt.hist(x)
    plt.title("Histogram")
    plt.show()

    # b)
    # TODO

    # c)
    vmax = q.vmax(x)
    px = np.sum(x * x) / len(x)
    px = lib.metrics.signal_power(x)
    r = np.arange(3, 9)

    snr_t = np.arange(len(r), dtype='float')
    snr_p = np.arange(len(r), dtype='float')

    for i in range(len(r)):
        delta_q = q.delta_q(vmax, r[i])
        vj, tj = q.uniform_midtread_quantizer(vmax, delta_q)
        mq = q.quantize(x, vmax, vj, tj)

        eq = x - mq
        pq = lib.metrics.signal_power(eq)

        snr_t = lib.metrics.snr_theoric(r[i], px, vmax)
        snr_p = lib.metrics.snr_db(px, pq)
예제 #3
0
def exercise_01():
    signal = lab01.sawtooth_signal()
    vmax = q.vmax(signal)
    r = 3

    delta_q = q.delta_q(vmax, r)
    vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
    mq, idx = q.quantize(signal, vmax, vj, tj)

    bin = c.pcm_encode(idx, r)
    dec = c.pcm_decode(bin)
예제 #4
0
def exercise_04():
    # a)
    signal = sawtooth_signal()
    vmax = q.vmax(signal)
    r = 3

    delta_q = q.delta_q(vmax, r)
    vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
    mq, idx = q.quantize(signal, vmax, vj, tj)

    print("m(q) = {}".format(mq))

    plt.plot(signal)
    plt.plot(mq)
    # plt.plot(xQ)
    plt.show()

    # b)
    # The mp(n) starts with the same element as m(n)
    mp = np.copy(mq)
    mp = np.insert(mp, 0, signal[0])
    mp = np.delete(mp, len(mp) - 1)

    # error formula
    error = signal - mp

    # quantization of error
    error_quantified, idx = q.quantize(error, vmax, vj, tj)

    plt.hist(error_quantified)
    plt.title("Histogram")
    plt.show()

    # c)
    px = metrics.signal_power(signal)
    r = np.arange(3, 9)

    snr_t = np.arange(len(r), dtype='float')
    snr_p = np.arange(len(r), dtype='float')

    for i in range(len(r)):
        delta_q = q.delta_q(vmax, r[i])
        vj, tj = q.uniform_midtread_quantizer(vmax, delta_q)
        mq, idx = q.quantize(signal, vmax, vj, tj)

        eq = signal - mq
        pq = metrics.signal_power(eq)

        snr_t[i] = lib.metrics.snr_theoric(r[i], px, vmax)
        snr_p[i] = lib.metrics.snr_db(px, pq)
예제 #5
0
def exercise_03():
    # Hamming parameters
    n = 15
    r = 11

    # Signal quantization
    m = lab01.sawtooth_signal()

    vmax = q.vmax(m)
    delta_q = q.delta_q(vmax, r)
    vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
    mq, idx = q.quantize(m, vmax, vj, tj)

    # Parity matrix
    P = np.array([
        [1, 1, 1, 1],
        [0, 1, 1, 1],
        [1, 0, 1, 1],
        [1, 1, 0, 1],
        [1, 1, 1, 0],
        [0, 0, 1, 1],
        [0, 1, 0, 1],
        [0, 1, 1, 0],
        [1, 0, 1, 0],
        [1, 0, 0, 1],
        [1, 1, 0, 0],
    ],
                 dtype='uint8')

    # Encode and codify with Hamming(15, 11)
    bin = c.pcm_encode(idx, r)
    x = error_control.hamming(bin, P, n, r)

    # Simulate channel communication
    y = channel.send_with_binomial_noise(x, 0.01)

    # Measure the elapsed time to correct errors
    from time import time
    start_time = time()

    # Detect and correct error/noise
    y = error_control.correction(y, P)

    elapsed_time = time() - start_time
    print(
        '3.    Error correction elapsed time: {:4.3f} s'.format(elapsed_time))
예제 #6
0
def exercise_05():
    # TODO
    # a)
    fs = 8000
    f = 3500

    t = np.arange(0, 5 * 1 / f, 1 / fs)
    m = np.sin(2 * np.pi * f * t)

    r = 3

    vmax = q.vmax(m)
    delta_q = q.delta_q(vmax, r)
    vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
    mq, idx = q.quantize(m, vmax, vj, tj)
    x = c.pcm_encode(idx, r)

    print(
        '5. a) First 4 samples of the signal y(t) = sin(2 * pi * 3500 * t) with fs = {}: {}'
        .format(fs, m))
    print('5. a) Midrise quantizer with r = 3 codification: {}'.format(
        np.ndarray.flatten(x)))
예제 #7
0
def exercise_04():
    # Parity matrix: http://michael.dipperstein.com/hamming/

    # Hamming parameters
    n = 15
    r = 11

    # Signal quantization
    m = lab01.sawtooth_signal()

    vmax = q.vmax(m)
    delta_q = q.delta_q(vmax, r)
    vj, tj = q.uniform_midrise_quantizer(vmax, delta_q)
    mq, idx = q.quantize(m, vmax, vj, tj)

    # Parity matrix
    P = np.array([
        [1, 1, 1, 1],
        [0, 1, 1, 1],
        [1, 0, 1, 1],
        [1, 1, 0, 1],
        [1, 1, 1, 0],
        [0, 0, 1, 1],
        [0, 1, 0, 1],
        [0, 1, 1, 0],
        [1, 0, 1, 0],
        [1, 0, 0, 1],
        [1, 1, 0, 0],
    ],
                 dtype='uint8')

    # Encode and codify with Hamming(15, 11)
    bin = c.pcm_encode(idx, r)
    x = error_control.hamming(bin, P, n, r)

    ber_theoric = np.array([.01, .05, .1, .5, .75, 1])
    ber_pratic = np.zeros(shape=(len(ber_theoric), 2))
    snr = np.zeros(len(ber_theoric))

    for i in range(len(ber_theoric)):
        # Channel simulation
        y = channel.send_with_binomial_noise(x, ber_theoric[i])
        ber_pratic[i, 0] = metrics.ber(x, y)

        # Error correction
        y = error_control.correction(y, P)
        ber_pratic[i, 1] = metrics.ber(bin, y)

        # Decode and Dequantize
        idx = c.pcm_decode(y)
        mq = q.dequantize(vj, idx)

        # SNR
        e = m - mq
        p_error = metrics.signal_power(e)
        p = metrics.signal_power(m)

        snr[i] = lib.metrics.snr_db(p, p_error)

        print(
            '4.    BERt = {:>6.2f}; BER = {:>6.3f}; BER\' = {:>6.3f}; SNR = {:>6.3f}'
            .format(ber_theoric[i], ber_pratic[i, 0], ber_pratic[i, 1],
                    snr[i]))
예제 #8
0
def exercise_06():
    # Hamming parameters
    n = 15
    r = 11

    # Quantization
    from lab01 import lab01
    m1 = lab01.sawtooth_signal()

    vmax = quantization.vmax(m1)
    delta_q = quantization.delta_q(vmax, r)
    vj, tj = quantization.uniform_midrise_quantizer(vmax, delta_q)
    x1, idx = quantization.quantize(m1, vmax, vj, tj)

    # Encoder
    P = np.array([
        [1, 1, 1, 1],
        [0, 1, 1, 1],
        [1, 0, 1, 1],
        [1, 1, 0, 1],
        [1, 1, 1, 0],
        [0, 0, 1, 1],
        [0, 1, 0, 1],
        [0, 1, 1, 0],
        [1, 0, 1, 0],
        [1, 0, 0, 1],
        [1, 1, 0, 0],
    ],
                 dtype='uint8')

    x2 = codification.pcm_encode(idx, r)

    # Error control
    x3 = error_control.hamming(x2, P, n, r)

    # Digital modulation
    a = 1
    x4 = modulation.manchester_enconde(x3, a)

    # Channel
    sigma_squared = np.array([0.5, 1, 2, 4])

    for s in sigma_squared:
        y1 = channel.send_with_awgn(x4, np.sqrt(s))

        # Digital modulation
        y2 = modulation.machester_decode(y1, lambda_=0)

        # Error control
        y3 = error_control.correction(y2, P)

        # BER calculation
        # TODO: tb = len(x4[0]) ?
        tb = len(x4)
        eb = metrics.eb_manchester(a, tb)
        n0 = s * 2

        ber_pratic = metrics.ber(x3, y2)
        ber_theoric = metrics.ber_manchester(eb, n0)

        # Decoder
        y4 = codification.pcm_decode(y3)

        # Quantization
        m2 = quantization.dequantize(vj, y4)

        # Metrics
        # TODO: SNR?
        plt.plot(m1)
        plt.plot(m2)
        plt.show()

    # Metrics
    # snr = np.zeros(len(sigma_squared))

    px = metrics.signal_power(m1)
    snr_theoric = lib.metrics.snr_theoric(r, px, vmax)

    error = m1 - x1
    pe = metrics.signal_power(error)
    snr_pratic = lib.metrics.snr_db(px, pe)

    print('')
예제 #9
0
def exercise():
    # hamming parameters
    n = 15
    r = 11

    # quantization
    m1, fs, filename = super_mario_intro('3sec')
    # m1, fs, filename = test_wav()
    # m1, fs, filename = sawtooth_signal()

    filename = 'lab04/{}'.format(filename)

    vmax = quantization.vmax(m1)
    delta_q = quantization.delta_q(vmax, r)
    vj, tj = quantization.uniform_midrise_quantizer(vmax, delta_q)

    x1, idx = quantization.quantize(m1, vmax, vj, tj)

    # codification
    x2 = codification.pcm_encode(idx, r)

    # error control
    parity_matrix = np.array([
        [1, 1, 1, 1],
        [0, 1, 1, 1],
        [1, 0, 1, 1],
        [1, 1, 0, 1],
        [1, 1, 1, 0],
        [0, 0, 1, 1],
        [0, 1, 0, 1],
        [0, 1, 1, 0],
        [1, 0, 1, 0],
        [1, 0, 0, 1],
        [1, 1, 0, 0],
    ],
                             dtype='uint8')

    x3 = error_control.hamming(x2, parity_matrix, n, r)

    # digital modulation
    x4, coords_o, new_bits = digital_modulation.qam_encode(x3, p=8)

    # channel
    sigma_square = np.array([0.05, 0.1, 0.2, 0.3])

    snr_channel = np.zeros(len(sigma_square))
    snr_reception = np.zeros(len(sigma_square))

    ber_bc = np.zeros(len(sigma_square))
    ber_ac = np.zeros(len(sigma_square))

    fig_signal = plt.figure(1)
    fig_received_signal = plt.figure(2, figsize=(12, 10))
    fig_constellation = plt.figure(3, figsize=(12, 10))

    for i in range(len(sigma_square)):
        y1 = channel.send_with_awgn(x4, sigma=np.sqrt(sigma_square[i]))

        # digital modulation
        y2, coords_r, coords_p = digital_modulation.qam_decode(
            y1, p=8, rm_bits=new_bits)

        # error control
        y3 = error_control.correction(y2, parity_matrix)

        # codification
        y4 = codification.pcm_decode(y3)

        # quantization
        m2 = quantization.dequantize(vj, y4)

        # output
        wav.write(filename.format(sigma_square[i]), fs, m2.astype('int16'))

        # metrics
        ax_received_signal = fig_received_signal.add_subplot(2, 2, i + 1)
        ax_constellation = fig_constellation.add_subplot(2, 2, i + 1)

        signal_graph(ax_received_signal, m2, sigma_square[i])
        constellation_graph(ax_constellation, coords_o, coords_p, coords_r,
                            sigma_square[i])

        p_x4 = metrics.signal_power(x4)
        p_y1 = metrics.signal_power(y1)
        snr_channel[i] = metrics.snr(p_x4, p_y1)

        p_m1 = metrics.signal_power(m1)
        p_m2 = metrics.signal_power(m2)
        snr_reception[i] = metrics.snr(p_m1, p_m2)

        ber_bc[i] = metrics.ber(x3, y2)
        ber_ac[i] = metrics.ber(x2, y3)

    # metrics
    ax_signal = fig_signal.add_subplot(1, 1, 1)
    ax_signal.set_title('Transmitted signal')
    ax_signal.set_xlabel('time')
    ax_signal.set_ylabel('amplitude')
    ax_signal.plot(m1)

    fig_received_signal.suptitle('Received signal')
    fig_constellation.suptitle('16-QAM constellation')

    fig_ber_snr = plt.figure(4)
    ber_snr_graph(fig_ber_snr.add_subplot(1, 1, 1), ber_ac, ber_bc,
                  snr_channel, snr_reception, sigma_square)

    plt.tight_layout()
    plt.show()