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
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)
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
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)
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
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
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)
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
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)
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