Ejemplo n.º 1
0
def findSYNC(source):
    found = []
    max_value = 0
    max_index = -1
    pn = UT.getPN(sync_pn_seed, pnsize) * 100
    #print("pn: ", pn[:20])
    corrarray = []
    aa = datetime.datetime.now()
    for idx in range(frameSize + 2):
        transformed = np.fft.fft(source[idx:idx + int(frameSize)])
        begin, end = UT.getTargetFreqBand(transformed, pnsize, subband[0])
        corr = abs(np.corrcoef(transformed.real[begin:end], pn)[0][1])
        #corr = np.correlate(transformed[begin:end, 1], pn)
        corrarray.append(corr)
        if max_value <= corr:
            max_value = corr
            max_index = idx
    bb = datetime.datetime.now()
    print("execution time: ", bb - aa)
    print("max: ", max_value, max_index)
    print("pn_max/min : ", pn.max(), pn.min())
    # plt.plot(corrarray)
    # plt.show()

    if max_value > detectionThreshold:
        return max_index
    else:
        print("Can't find cross-correlation peak over 0.8, max:%d in idx:%d" %
              (max_value, max_index))
        return -1
Ejemplo n.º 2
0
def insertSYNC(inbuf, outbuf):
    pn = UT.getPN(sync_pn_seed, pnsize)
    for repeat in range(NUMOFSYNCREPEAT):
        for idx in range(int(pnsize / partialPnSize)):
            begin = idx * partialPnSize
            end = begin + partialPnSize
            insertBit(inbuf, outbuf, pn[begin:end],
                      NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN)
Ejemplo n.º 3
0
def insertBitOld(sourceSignal, bit, pnSeed, framesize, overwrite = False):
    pn = UT.getPN(pnSeed, pnsize)
    #print("insertBit, pn:", pn[:5])

    if (True): # Basic Algorithm
        #watermarkedSignal = np.add(originalSignal, np.multiply(pn, bit))
        sourceSpectrum = np.fft.fft(sourceSignal)

        #plt.plot(sourceSpectrum)
        adjustedSpectrum = sourceSpectrum.copy()
        # plt.plot(adjustedSpectrum[:,1])

        for band in subband:
            begin, end = UT.getTargetFreqBand(adjustedSpectrum, pnsize, band)
            if overwrite == True:
                adjustedSpectrum.real[begin:end] = pn * bit
            else:
                adjustedSpectrum.real[begin:end] += (pn * bit / 10000)
        # plt.plot(adjustedSpectrum[:, 1])

        #print ("%d -> %d " % (bit, UT.SGN(adjustedSpectrum[begin:end, 1], pn)))

        watermarkedSignal = np.fft.ifft(adjustedSpectrum).real

        # l1, = plt.plot(sourceSignal, label="L1")
        # l2, = plt.plot(watermarkedSignal, label='l2')
        # l3, = plt.plot(watermarkedSignal - sourceSignal, label='diff')
        # plt.legend(handles = [l1,l2,l3])
        # plt.show()

        #watermarkedSignal = np.multiply(sourceSignal, np.multiply(pn, bit))
        #watermarkedSignal = np.multiply(pn, bit)
        #watermarkedSignal = pn
    else:   # improved algorithm (Not work well)
        a1 = 0.005
        a2 = 0.001
        nlambda = 0.9
        psi = UT.norminnerproduct(sourceSignal, pn)
        if (psi >= 0 and bit == 1):
            watermarkedSignal = np.add(sourceSignal, np.multiply(pn, a1))
        elif (psi >= 0 and bit == -1):
            watermarkedSignal = np.add(sourceSignal, np.multiply(pn, -1 * (a2 + nlambda * psi)))
        elif (psi < 0 and bit == -1):
            watermarkedSignal = np.add(sourceSignal, np.multiply(pn, -1 * a1))
        elif (psi < 0 and bit == 1):
            watermarkedSignal = np.add(sourceSignal, np.multiply(pn, -1 * (a2 - nlambda * psi)))

    return watermarkedSignal
Ejemplo n.º 4
0
def printMSG(posRead):
    print("---------------------------")
    source, realPos = yield from rb.readfrom(frameSize * 88, posRead)
    ix = 0
    ppn = UT.getPN(msg_pn_seed, pnsize)
    bitseq = []
    for n in range(88):
        begin = ix + n * frameSize
        end = begin + frameSize
        fram = source[begin:end]
        tr = np.fft.fft(fram)
        begin, end = UT.getTargetFreqBand(tr, pnsize, subband[0])
        re, accu = UT.SGN(tr.real[begin:end], ppn)
        bitseq.append(re)
    UT.convertNegative2Zero(bitseq)
    UT.print8bitAlignment(bitseq)
Ejemplo n.º 5
0
def showPN(position=415797, count=11, numOfShift=4):
    global rb
    pn = UT.getPN(sync_pn_seed, pnsize)
    numOfPartialPNs = int((pnsize + partialPnSize - 1) / partialPnSize)
    corrarray = np.ndarray(shape=(numOfShift, count))
    corrarray.fill(0.0)
    targetFrameSize = frameSize * numOfPartialPNs

    orgPos = position
    for shift in range(numOfShift):
        position = orgPos + shift
        for idx in range(count):
            source, realPos = yield from rb.readfrom(targetFrameSize, position)
            if (realPos != position):
                print("warning!!  wrong position realPos %d, position %d" %
                      (realPos, position))

            try:
                extractedPN = np.ndarray(shape=(pnsize))
                extractedPN.fill(0.0)
                for pnIdx in range(numOfPartialPNs):
                    begin = pnIdx * frameSize
                    end = begin + frameSize
                    transformed = np.fft.fft(source[begin:end])
                    b, e = UT.getTargetFreqBand(transformed, partialPnSize,
                                                subband[0])
                    extractedPN[pnIdx * partialPnSize:(pnIdx + 1) *
                                partialPnSize] = transformed.real[b:e]

                posRead = realPos + int(targetFrameSize)
                r1, r2 = UT.SGN(extractedPN, pn)
                #print("before: ", r1, extractedPN)
                #extractedPN = extractedPN * r1  # pn 사인 원복
                #print("after: ", r1, extractedPN)
                #print (r1)
                corr = abs(np.corrcoef(extractedPN, pn)[0][1])
                corrarray[shift][idx] = corr

            except Exception as err:
                print(err)
                return -1, posRead

            position = posRead + targetFrameSize
    print(corrarray)
    plt.plot(corrarray[:, :])
    plt.show()
    return
Ejemplo n.º 6
0
def findSYNC(position, searchingMaxCorr=True):
    if searchingMaxCorr:
        posMaxCorr, posRead = yield from getMaxCorr(position)
        if (posMaxCorr < 0):
            return posMaxCorr, posRead
    else:
        posMaxCorr = position

    # get correlations from leftmost to rightmost
    corrArray = []
    pn = UT.getPN(sync_pn_seed, pnsize)
    numOfPartialPNs = int(pnsize / partialPnSize)
    leftMostPos = basePos = posMaxCorr - (
        (NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN - 1) * frameSize)
    sizeOfFramesPerFullPN = frameSize * numOfPartialPNs * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN
    Nframes, realPos = yield from rb.readfrom(
        (NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN *
         (numOfPartialPNs + 2) * frameSize), basePos)
    for idx in range(NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN * 2 - 1):
        begin = idx * frameSize
        end = begin + sizeOfFramesPerFullPN
        extractedPN = extractPN(Nframes[begin:end],
                                NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN,
                                numOfPartialPNs)
        corrArray.append(abs(np.corrcoef(extractedPN, pn)[0][1]))
        basePos += frameSize

    # search maximum summation
    maxSummation = 0
    maxSummationIdx = -1
    for idx in range(NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN):
        s = sum(corrArray[idx:idx + NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN])
        print("::", idx, s,
              corrArray[idx:idx + NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN])
        if maxSummation < s:
            maxSummation = s
            maxSummationIdx = idx

    # find next position after SYNC
    initialPosMaxCorr = posMaxCorr
    posMaxCorr = leftMostPos + maxSummationIdx * frameSize
    print("begin of SYNC : %d -> %d" % (initialPosMaxCorr, posMaxCorr))
    endOfSync = posMaxCorr + (numOfPartialPNs *
                              NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN * frameSize)
    print("end of SYNC : ", endOfSync)
    return posMaxCorr, endOfSync
Ejemplo n.º 7
0
def insertWM(inbuf, outbuf, msg=" "):
    try:
        out_writeptr = outbuf.writeptr()
        print("Insert SYNC - begin", inbuf.readptr(), outbuf.writeptr())
        insertSYNC(inbuf, outbuf)
        print("Insert SYNC - end", inbuf.readptr(), outbuf.writeptr())

        pn = UT.getPN(sync_pn_seed, pnsize)
        print("pn: ", pn)
        interval = int(frameSize / 8)
        for di in range(int(frameSize / interval) * 2 + 1):
            ePN = extractPN(outbuf, out_writeptr + interval * di)
            print("Pos: ", out_writeptr + interval * di, "ePN%d : " % di,
                  abs(np.corrcoef(pn, ePN)[0][1]), ", epn:", ePN)

        out_writeptr = outbuf.writeptr()
        print("Insert MSG - begin", inbuf.readptr(), outbuf.writeptr())
        insertMSG(inbuf, outbuf, msg)
        print("Insert MSG - end", inbuf.readptr(), outbuf.writeptr())
        # extractMSG(outbuf, out_writeptr)
    except Exception as err:
        print(err)
Ejemplo n.º 8
0
def extractSYNC(outbuf, position):
    found = []
    for bitIdx, value in enumerate(SYNC):
        pn = UT.getPN(sync_pn_seed, pnsize)
        numOfPartialPNs = int((pnsize + partialPnSize - 1) / partialPnSize)
        embededData = []

        for idx in range(numOfPartialPNs):
            begin = idx * partialPnSize
            end = begin + partialPnSize
            if end > pnsize:
                end = pnsize
            embededDataLength = end - begin

            srcBegin = position + idx * frameSize
            srcEnd = srcBegin + frameSize
            targetFrame, realPos = outbuf.readfromSync(frameSize, srcBegin, update_ptr=False)
            srcSpectrum = np.fft.fft(targetFrame)

            begin, end = UT.getTargetFreqBand(srcSpectrum, embededDataLength, subband[0])
            embededData.extend(srcSpectrum.real[begin:end])
        position = srcEnd

        result, accuracy = UT.SGN(embededData, pn)
        if (result == value):
            found.append(result)
        else:
            break

    UT.printwithsign("SYNC:", SYNC)
    UT.printwithsign("BITS:", found)
    if (found == SYNC):
        print("SYNC is found")
        return True
    else:
        print("SYNC is not found: ", found)
        return False
Ejemplo n.º 9
0
def insertSYNC(inbuf, outbuf):
    for repeat in range(NUMOFSYNCREPEAT):
        for idx, value in enumerate(SYNC):
            #print("before:::", target[idx * framelength:idx * framelength+10])
            pn = UT.getPN(sync_pn_seed, pnsize)
            insertBit(inbuf, outbuf, value, pn, overwrite=True)
Ejemplo n.º 10
0
def getMaxCorr(position):
    global rb
    found = []
    max_corr = 0
    posMaxCorr = -1
    posRead = 0
    pn = UT.getPN(sync_pn_seed, pnsize)
    numOfPartialPNs = int((pnsize + partialPnSize - 1) / partialPnSize)
    #print("pn: ", pn[:20])
    corrarray = []
    dotparray = []
    aa = datetime.datetime.now()
    targetFrameSize = frameSize * (numOfPartialPNs *
                                   NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN) * 2
    source, realPos = yield from rb.readfrom(targetFrameSize, position)
    # plt.plot(source)
    # plt.show()
    if (realPos != position):
        print("warning!!  wrong position realPos %d, position %d" %
              (realPos, position))

    try:
        idxList = [
            int(i * (frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN / 2))
            for i in range(numOfPartialPNs * 2)
        ]
        #print("getMaxCorr: pos", position, idxList)
        for idx in idxList:  # partialPnSize 의 절반씩 옮기면서 correlation 계산
            extractedPN = []
            for pnIdx in range(numOfPartialPNs):
                begin = idx + pnIdx * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN * frameSize
                end = begin + frameSize
                transformed = np.fft.rfft(source[begin:end])
                freq = [
                    BASE_FREQ_OF_DATA_EMBEDDING +
                    i * FREQ_INTERVAL_OF_DATA_EMBEDDING
                    for i in range(partialPnSize)
                ]
                #print ("bef freq:", freq)
                for fIdx, val in enumerate(freq):
                    freq[fIdx] = int(
                        val / (fs / 2 / (len(transformed))))  # search bands
                    extractedPN.append(abs(transformed[freq[fIdx]]))

                #print("aft freq:", freq)
                #b, e = UT.getTargetFreqBand(transformed, partialPnSize, subband[0])

            posRead = realPos + idx + int(numOfPartialPNs * frameSize)
            corr = abs(np.corrcoef(extractedPN, pn)[0][1])
            corrarray.append(corr)

            r1, r2 = UT.SGN(extractedPN, pn)
            dotparray.append(r2)

            if max_corr <= corr:
                max_corr = corr
                posMaxCorr = realPos + idx

    except Exception as err:
        print(err)
        return -1, posRead
    # plt.plot(dotparray)
    # plt.plot(corrarray)
    # plt.show()

    bb = datetime.datetime.now()
    print("execution time: ", (bb - aa).total_seconds())
    print("--------------------max: %10.2f, %d" % (max_corr, posMaxCorr))
    #print("pn_max/min : ", pn.max(), pn.min())
    # plt.plot(corrarray)
    # plt.show()

    if max_corr >= detectionThreshold:
        print("--------------------Found maximum:", posMaxCorr, max_corr,
              posRead)
        return posMaxCorr, posRead
    else:
        #print("Can't find cross-correlation peak over 0.8, max:%d in idx:%d" % (max_value, max_index))
        return -1, posRead