Esempio 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
Esempio n. 2
0
def insertBit(inbuf, outbuf, bit, pn, overwrite = False):
    numOfPartialPNs = int((pnsize + partialPnSize - 1) / partialPnSize)
    embededData = pn * bit

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

        targetFrame = inbuf.read(frameSize)
        if targetFrame.size < frameSize:
            raise NotEnoughData("insertBit", outbuf, targetFrame)
        targetSpectrum = np.fft.fft(targetFrame)

        for band in subband: # embed a bit to multiple subbands
            begin, end = UT.getTargetFreqBand(targetSpectrum, embededDataLength, band)
            if overwrite == True:
                targetSpectrum.real[begin:end] = partialEmbededData * (len(targetSpectrum) * 0.7 / (end - begin)) # Magnitude 강화
            else:
                targetSpectrum.real[begin:end] += partialEmbededData

        u = np.fft.ifft(targetSpectrum)
        outbuf.write(np.fft.ifft(targetSpectrum).real)
Esempio n. 3
0
def insertBit1(inbuf, outbuf, partialPN):
    bandsPer1PN = 3

    fullWindow = get_window('hamming', frameSize)
    leftHalfWindow = fullWindow.copy()
    rightHalfWindow = fullWindow.copy()
    center = int(frameSize / 2)
    leftHalfWindow[:center] = leftHalfWindow[center]
    rightHalfWindow[center:] = rightHalfWindow[center]

    # In Freq domain, Generate 3 Frames of New Signal Y which embed data
    emptySpectrum = np.array([
        np.complex128(0.0) for i in range(
            int(frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN / 2 + 1))
    ])
    beginBand, endBand = UT.getTargetFreqBand(emptySpectrum,
                                              len(partialPN) * bandsPer1PN,
                                              subband[0])
    for idx, value in enumerate(partialPN):
        b = beginBand + idx * bandsPer1PN * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN
        e = b + bandsPer1PN * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN
        emptySpectrum.real[b] = value * (len(emptySpectrum.real) * 0.7 /
                                         (endBand - beginBand))  # Magnitude 강화
        #print (len(emptySpectrum.real), " ", idx, ". b: %d" % b, ", val: ", emptySpectrum.real[b:b+3])
        #emptySpectrum.imag[b] = emptySpectrum.real[b]

    # IFFT
    dataSignal = np.fft.irfft(emptySpectrum)
    # UT.plotInNewProcess("freq", abs(emptySpectrum))
    # UT.plotInNewProcess("org", dataSignal)

    # wy = windowing to 3 frames
    dataSignal[:frameSize] *= leftHalfWindow
    dataSignal[-frameSize:] *= rightHalfWindow
    dataSignal /= max(abs(dataSignal.max()), abs(dataSignal.min()))
    # UT.plotInNewProcess("L window", leftHalfWindow)
    # UT.plotInNewProcess("R window", rightHalfWindow)
    # UT.plotInNewProcess("C window", fullWindow)
    # UT.plotInNewProcess("windowed", dataSignal, True)

    # output = mix (org, wy)
    mixedSignal = np.array([
        np.float32(0.0)
        for i in range(frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN)
    ])
    for i in range(NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN):
        frame = inbuf.read(frameSize)
        if frame.size < frameSize:
            raise NotEnoughData("insertBit", frame.size, "/", frameSize)
        mixedSignal[frameSize * i:frameSize * (i + 1)] = mix(
            frame, dataSignal[frameSize * i:frameSize * (i + 1)])

    outbuf.write(mixedSignal)
Esempio n. 4
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
Esempio n. 5
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)
Esempio n. 6
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
Esempio n. 7
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
Esempio n. 8
0
def extractMSG(outbuf, position):
    idx = 0
    numOfPartialPNs = int((pnsize + partialPnSize - 1) / partialPnSize)
    pnlist = UT.generatePnList()
    result = str("")
    while (True):
        begin = position + (idx * frameSize * numOfPartialPNs)
        end = begin + frameSize * numOfPartialPNs
        idx += 1

        embededCode = [[] for i in subband]
        for frameIdx in range(numOfPartialPNs):
            b = begin + frameIdx * frameSize
            e = b + frameSize
            frame, realPos = outbuf.readfromSync(frameSize, b, update_ptr=False)
            transformed = np.fft.fft(frame)
            for num, band in enumerate(subband):
                b, e = UT.getTargetFreqBand(transformed, partialPnSize, band)
                embededCode[num].extend(transformed.real[b:e])

        maxCorr = 0
        maxCorrIdx = -1
        for num, band in enumerate(subband):
            for i, value in enumerate(pnlist):
                corr = abs(np.corrcoef(embededCode[num], value)[0][1])
                if corr > maxCorr:
                    maxCorr = corr
                    maxCorrIdx = i

        character = chr(maxCorrIdx)
        print("%c[ %d ]" % (character, maxCorrIdx), end=" ")
        if character == '\n':
            break
        result += character
    print("")
    return result, end
Esempio n. 9
0
def insertBit0(inbuf, outbuf, partialPN):
    bandsPer1PN = 3
    hopSize = 512

    orgSignal = np.array([
        np.float32(0.0)
        for i in range(frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN)
    ])
    newSignal = np.array([
        np.float32(0.0)
        for i in range(frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN)
    ])
    begin = 0
    filledOrgSignal = 0

    fullWindow = get_window('hamming', frameSize)
    leftHalfWindow = fullWindow.copy()
    rightHalfWindow = fullWindow.copy()
    center = int(frameSize / 2)
    leftHalfWindow[:center] = leftHalfWindow[center]
    rightHalfWindow[center:] = rightHalfWindow[center]

    # normalized window
    fullWindow = fullWindow / sum(fullWindow)
    leftHalfWindow = leftHalfWindow / sum(leftHalfWindow)
    rightHalfWindow = rightHalfWindow / sum(rightHalfWindow)
    bo = True
    while (begin + frameSize <= frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN
           ):  # N frames 에 hop size 만큼 이동하면서 partialPN을 입력
        if filledOrgSignal < begin + frameSize:
            frame = inbuf.read(frameSize)
            if frame.size < frameSize:
                raise NotEnoughData("insertBit", frame.size, "/", frameSize)
            orgSignal[filledOrgSignal:filledOrgSignal + frameSize] = frame
            filledOrgSignal += frameSize

        AllowedFrameToEmbedData = True
        # Windowing
        end = begin + frameSize
        if begin == 0:  # left half는 윈도우 제거
            windowedSignal = orgSignal[begin:end] * leftHalfWindow
            AllowedFrameToEmbedData = False
        elif begin + frameSize == frameSize * NUM_OF_FRAMES_PER_PARTIAL_SYNC_PN:  # right half는 윈도우 제거
            windowedSignal = orgSignal[begin:end] * rightHalfWindow
            AllowedFrameToEmbedData = False
        else:
            windowedSignal = orgSignal[begin:end] * fullWindow
            AllowedFrameToEmbedData = True

        # Time to Frequency domain transform
        targetSpectrum = np.fft.rfft(windowedSignal)
        # if bo:
        #     UT.plotInNewProcess("org", orgSignal[begin:end])
        #     UT.plotInNewProcess("win", windowedSignal)
        #     UT.plotInNewProcess("tSpec", targetSpectrum.real)

        # Data Embedding
        for band in subband:  # embed a bit to multiple subbands
            beginBand, endBand = UT.getTargetFreqBand(
                targetSpectrum,
                len(partialPN) * bandsPer1PN, band)
            for idx, value in enumerate(partialPN):
                b = beginBand + idx * bandsPer1PN
                e = b + bandsPer1PN
                if AllowedFrameToEmbedData is True:
                    #targetSpectrum.real[b:e] = value * (len(targetSpectrum.real) * 0.7 / (endBand - beginBand)) # Magnitude 강화
                    targetSpectrum.real[256] = 128.0

        # Frequency to Time domain transform
        newSignal[begin:end] += np.fft.irfft(targetSpectrum)  # * hopSize
        #print ("max : ", newSignal[begin:end], newSignal.max())

        # if bo:
        #     bo = False
        #     UT.plotInNewProcess("tSpec2", targetSpectrum.real)
        #     UT.plotInNewProcess("partialPN", partialPN)
        #     UT.plotInNewProcess("new", newSignal[begin:end], True)
        begin += hopSize

    outbuf.write(newSignal)