Numpy combine channels

Discussion in 'Python' started by Wanderer, Sep 10, 2012.

  1. Wanderer

    Wanderer Guest

    I have an array generated by audiolab of left and right stereo channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine the left and right channels to get an array [2,3,5]. Is there a numpy command to do that?

    Thanks
    Wanderer, Sep 10, 2012
    #1
    1. Advertising

  2. Wanderer

    Nick Cash Guest

    > I have an array generated by audiolab of left and right stereo
    > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine
    > the left and right channels to get an array [2,3,5]. Is there a numpy
    > command to do that?


    You may be over-thinking this, and numpy might not be necessary.

    A simple solution would be just a quick list comprehension:

    stereo_array = [[1, 1], [1, 2], [2, 3]]
    mono_array = [l+r for (l, r) in stereo_array]

    Thanks,
    Nick Cash
    Nick Cash, Sep 10, 2012
    #2
    1. Advertising

  3. Wanderer

    Wanderer Guest

    On Monday, September 10, 2012 3:39:11 PM UTC-4, Wanderer wrote:
    > I have an array generated by audiolab of left and right stereo channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine the left and right channels to get an array [2,3,5]. Is there a numpy command to do that?
    >
    >
    >
    > Thanks


    I figured it out. numpy.sum(array, axis=1).
    Wanderer, Sep 10, 2012
    #3
  4. Wanderer

    MRAB Guest

    On 10/09/2012 20:39, Wanderer wrote:
    > I have an array generated by audiolab of left and right stereo
    > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine
    > the left and right channels to get an array [2,3,5]. Is there a numpy
    > command to do that?
    >
    >>> import numpy
    >>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    array([[1, 1],
    [1, 2],
    [2, 3]])
    >>> a[:, 0]

    array([1, 1, 2])
    >>> a[:, 1]

    array([1, 2, 3])
    >>> a[:, 0] + a[:, 1]

    array([2, 3, 5])

    But should they be added together to make mono?

    Suppose, for example, that both channels have a maximum value. Their
    sum would be _twice_ the maximum.

    Therefore, I think that it should probably be the average.

    >>> (a[:, 0] + a[:, 1]) / 2

    array([1, 1, 2])
    MRAB, Sep 10, 2012
    #4
  5. Wanderer

    Wanderer Guest

    On Monday, September 10, 2012 4:12:40 PM UTC-4, MRAB wrote:
    > On 10/09/2012 20:39, Wanderer wrote:
    >
    > > I have an array generated by audiolab of left and right stereo

    >
    > > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine

    >
    > > the left and right channels to get an array [2,3,5]. Is there a numpy

    >
    > > command to do that?

    >
    > >

    >
    > >>> import numpy

    >
    > >>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    >
    > array([[1, 1],
    >
    > [1, 2],
    >
    > [2, 3]])
    >
    > >>> a[:, 0]

    >
    > array([1, 1, 2])
    >
    > >>> a[:, 1]

    >
    > array([1, 2, 3])
    >
    > >>> a[:, 0] + a[:, 1]

    >
    > array([2, 3, 5])
    >
    >
    >
    > But should they be added together to make mono?
    >
    >
    >
    > Suppose, for example, that both channels have a maximum value. Their
    >
    > sum would be _twice_ the maximum.
    >
    >
    >
    > Therefore, I think that it should probably be the average.
    >
    >
    >
    > >>> (a[:, 0] + a[:, 1]) / 2

    >
    > array([1, 1, 2])


    I'm decoding morse code. So it's CV dots and dashes.
    Wanderer, Sep 10, 2012
    #5
  6. Wanderer

    Wanderer Guest

    On Monday, September 10, 2012 4:12:40 PM UTC-4, MRAB wrote:
    > On 10/09/2012 20:39, Wanderer wrote:
    >
    > > I have an array generated by audiolab of left and right stereo

    >
    > > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine

    >
    > > the left and right channels to get an array [2,3,5]. Is there a numpy

    >
    > > command to do that?

    >
    > >

    >
    > >>> import numpy

    >
    > >>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    >
    > array([[1, 1],
    >
    > [1, 2],
    >
    > [2, 3]])
    >
    > >>> a[:, 0]

    >
    > array([1, 1, 2])
    >
    > >>> a[:, 1]

    >
    > array([1, 2, 3])
    >
    > >>> a[:, 0] + a[:, 1]

    >
    > array([2, 3, 5])
    >
    >
    >
    > But should they be added together to make mono?
    >
    >
    >
    > Suppose, for example, that both channels have a maximum value. Their
    >
    > sum would be _twice_ the maximum.
    >
    >
    >
    > Therefore, I think that it should probably be the average.
    >
    >
    >
    > >>> (a[:, 0] + a[:, 1]) / 2

    >
    > array([1, 1, 2])


    I'm decoding morse code. So it's CV dots and dashes.
    Wanderer, Sep 10, 2012
    #6
  7. Wanderer

    Wanderer Guest

    On Monday, September 10, 2012 4:14:18 PM UTC-4, Wanderer wrote:
    > On Monday, September 10, 2012 4:12:40 PM UTC-4, MRAB wrote:
    >
    > > On 10/09/2012 20:39, Wanderer wrote:

    >
    > >

    >
    > > > I have an array generated by audiolab of left and right stereo

    >
    > >

    >
    > > > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine

    >
    > >

    >
    > > > the left and right channels to get an array [2,3,5]. Is there a numpy

    >
    > >

    >
    > > > command to do that?

    >
    > >

    >
    > > >

    >
    > >

    >
    > > >>> import numpy

    >
    > >

    >
    > > >>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    >
    > >

    >
    > > array([[1, 1],

    >
    > >

    >
    > > [1, 2],

    >
    > >

    >
    > > [2, 3]])

    >
    > >

    >
    > > >>> a[:, 0]

    >
    > >

    >
    > > array([1, 1, 2])

    >
    > >

    >
    > > >>> a[:, 1]

    >
    > >

    >
    > > array([1, 2, 3])

    >
    > >

    >
    > > >>> a[:, 0] + a[:, 1]

    >
    > >

    >
    > > array([2, 3, 5])

    >
    > >

    >
    > >

    >
    > >

    >
    > > But should they be added together to make mono?

    >
    > >

    >
    > >

    >
    > >

    >
    > > Suppose, for example, that both channels have a maximum value. Their

    >
    > >

    >
    > > sum would be _twice_ the maximum.

    >
    > >

    >
    > >

    >
    > >

    >
    > > Therefore, I think that it should probably be the average.

    >
    > >

    >
    > >

    >
    > >

    >
    > > >>> (a[:, 0] + a[:, 1]) / 2

    >
    > >

    >
    > > array([1, 1, 2])

    >
    >
    >
    > I'm decoding morse code. So it's CV dots and dashes.


    In case anyone is interested, here is the full code.

    # morsecode.py
    import numpy as np
    from scikits.audiolab import wavread
    from scipy.signal import decimate
    from pylab import plot
    from pylab import show
    import os

    def movingaverage(interval, window_size):
    window = np.ones(int(window_size)) / float(window_size)
    return np.convolve(interval, window, 'same')

    def wav2morse(resultDir, filename):
    """ Convert a wave file to morse code
    resultDir: directory for wave file and results
    filename: wave file name

    """
    data, _fs, _enc = wavread(resultDir + '\\' + filename)
    data = np.sum(data, axis=1)
    data = np.fabs(data)
    data = movingaverage(data, 100)
    data = decimate(data, 2)
    highcount = 0
    lowcount = 0
    fileBase, _fileExt = os.path.splitext(filename)
    f = open(resultDir + '\\' + fileBase + '.txt', 'w')
    for d in data:
    if d > 0.3:
    if lowcount > 3000:
    f.write(' ')
    lowcount = 0
    highcount += 1
    else:
    if highcount > 3000:
    f.write('-')
    elif highcount > 1000:
    f.write('.')
    highcount = 0
    lowcount += 1
    f.close()
    Wanderer, Sep 10, 2012
    #7
  8. Wanderer

    Wanderer Guest

    On Monday, September 10, 2012 4:14:18 PM UTC-4, Wanderer wrote:
    > On Monday, September 10, 2012 4:12:40 PM UTC-4, MRAB wrote:
    >
    > > On 10/09/2012 20:39, Wanderer wrote:

    >
    > >

    >
    > > > I have an array generated by audiolab of left and right stereo

    >
    > >

    >
    > > > channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine

    >
    > >

    >
    > > > the left and right channels to get an array [2,3,5]. Is there a numpy

    >
    > >

    >
    > > > command to do that?

    >
    > >

    >
    > > >

    >
    > >

    >
    > > >>> import numpy

    >
    > >

    >
    > > >>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    >
    > >

    >
    > > array([[1, 1],

    >
    > >

    >
    > > [1, 2],

    >
    > >

    >
    > > [2, 3]])

    >
    > >

    >
    > > >>> a[:, 0]

    >
    > >

    >
    > > array([1, 1, 2])

    >
    > >

    >
    > > >>> a[:, 1]

    >
    > >

    >
    > > array([1, 2, 3])

    >
    > >

    >
    > > >>> a[:, 0] + a[:, 1]

    >
    > >

    >
    > > array([2, 3, 5])

    >
    > >

    >
    > >

    >
    > >

    >
    > > But should they be added together to make mono?

    >
    > >

    >
    > >

    >
    > >

    >
    > > Suppose, for example, that both channels have a maximum value. Their

    >
    > >

    >
    > > sum would be _twice_ the maximum.

    >
    > >

    >
    > >

    >
    > >

    >
    > > Therefore, I think that it should probably be the average.

    >
    > >

    >
    > >

    >
    > >

    >
    > > >>> (a[:, 0] + a[:, 1]) / 2

    >
    > >

    >
    > > array([1, 1, 2])

    >
    >
    >
    > I'm decoding morse code. So it's CV dots and dashes.


    In case anyone is interested, here is the full code.

    # morsecode.py
    import numpy as np
    from scikits.audiolab import wavread
    from scipy.signal import decimate
    from pylab import plot
    from pylab import show
    import os

    def movingaverage(interval, window_size):
    window = np.ones(int(window_size)) / float(window_size)
    return np.convolve(interval, window, 'same')

    def wav2morse(resultDir, filename):
    """ Convert a wave file to morse code
    resultDir: directory for wave file and results
    filename: wave file name

    """
    data, _fs, _enc = wavread(resultDir + '\\' + filename)
    data = np.sum(data, axis=1)
    data = np.fabs(data)
    data = movingaverage(data, 100)
    data = decimate(data, 2)
    highcount = 0
    lowcount = 0
    fileBase, _fileExt = os.path.splitext(filename)
    f = open(resultDir + '\\' + fileBase + '.txt', 'w')
    for d in data:
    if d > 0.3:
    if lowcount > 3000:
    f.write(' ')
    lowcount = 0
    highcount += 1
    else:
    if highcount > 3000:
    f.write('-')
    elif highcount > 1000:
    f.write('.')
    highcount = 0
    lowcount += 1
    f.close()
    Wanderer, Sep 10, 2012
    #8
  9. Wanderer

    Aahz Guest

    In article <>,
    MRAB <> wrote:
    >On 10/09/2012 20:39, Wanderer wrote:
    >>
    >> I have an array generated by audiolab of left and right stereo
    >> channels. It looks like [[1,1],[1,2],[2,3]]. I would like to combine
    >> the left and right channels to get an array [2,3,5]. Is there a numpy
    >> command to do that?

    >
    >>>> import numpy
    >>>> numpy.array([[1,1],[1,2],[2,3]], dtype="i")

    >array([[1, 1],
    > [1, 2],
    > [2, 3]])
    >>>> a[:, 0]

    >array([1, 1, 2])
    >>>> a[:, 1]

    >array([1, 2, 3])
    >>>> a[:, 0] + a[:, 1]

    >array([2, 3, 5])
    >
    >But should they be added together to make mono?
    >
    >Suppose, for example, that both channels have a maximum value. Their
    >sum would be _twice_ the maximum.
    >
    >Therefore, I think that it should probably be the average.
    >
    > >>> (a[:, 0] + a[:, 1]) / 2

    >array([1, 1, 2])


    I'd actually think it should be the max. Consider a stereo where one
    side is playing a booming bass while the other side is playing a rest
    note -- should the mono combination be half as loud as as the bass?
    --
    Aahz () <*> http://www.pythoncraft.com/

    "....Normal is what cuts off your sixth finger and your tail..." --Siobhan
    Aahz, Nov 10, 2012
    #9
  10. Wanderer

    Dave Angel Guest

    On 11/09/2012 11:30 PM, Aahz wrote:
    > In article <>,
    > MRAB <> wrote:
    >> <snip>
    >>
    >> But should they be added together to make mono?
    >>
    >> Suppose, for example, that both channels have a maximum value. Their
    >> sum would be _twice_ the maximum.
    >>
    >> Therefore, I think that it should probably be the average.
    >>
    >>>>> (a[:, 0] + a[:, 1]) / 2

    >> array([1, 1, 2])

    > I'd actually think it should be the max. Consider a stereo where one
    > side is playing a booming bass while the other side is playing a rest
    > note -- should the mono combination be half as loud as as the bass?


    max would sound awful.

    The right answer is to add them with weighting, then scale the whole
    waveform according to a new calculation of clipping. Just like a mixer,
    you have level controls on each input, then an overall gain.

    So if the inputs were x and y, the output would be gain *( x_scale * x
    + y_scale * y), but it'd normally be done in two passes, so as to
    minimize the places that are clipped, while maximizing the average.
    it's also possible to have gain vary across the time axis, like an agc.
    But you wouldn't want that as a default, as it'd destroy the dynamics of
    a musical piece.

    One more consideration. If these are unsigned values (eg. 0 to 255),
    then you should adjust both signals by 128 before storing them as signed
    values, do your arithmetic, and then adjust again by adding 128. You
    could do the algebraic equivalent, but the programming would be much
    simpler on signed values.



    --

    DaveA
    Dave Angel, Nov 10, 2012
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. drife
    Replies:
    1
    Views:
    352
    Travis E. Oliphant
    Mar 1, 2006
  2. Duncan Smith
    Replies:
    3
    Views:
    409
    Duncan Smith
    Apr 25, 2007
  3. Replies:
    2
    Views:
    479
    Robert Kern
    Nov 13, 2007
  4. W. eWatson
    Replies:
    2
    Views:
    913
    W. eWatson
    Nov 23, 2009
  5. Tom Kacvinsky

    Installing numpy over an older numpy

    Tom Kacvinsky, Jun 15, 2012, in forum: Python
    Replies:
    1
    Views:
    336
    Miki Tebeka
    Jun 15, 2012
Loading...

Share This Page