| 957 | |
| 958 | |
| 959 | def _calc_spectrogram(timeSignal, timeVector, samplingRate, overlap, winType, |
| 960 | winSize, dBRef): |
| 961 | window = eval('ss.windows.' + winType)(winSize) |
| 962 | nextIdx = int(winSize*overlap) |
| 963 | rng = int(timeSignal.shape[0]/winSize/overlap - 1) |
| 964 | _spectrogram = np.zeros((winSize//2 + 1, rng)) |
| 965 | _specFreq = np.linspace(0, samplingRate//2, winSize//2 + 1) |
| 966 | _specTime = np.linspace(0, timeVector[-1], rng) |
| 967 | |
| 968 | for N in range(rng): |
| 969 | try: |
| 970 | strIdx = N*nextIdx |
| 971 | endIdx = winSize + N*nextIdx |
| 972 | sliceAudio = window*timeSignal[strIdx:endIdx] |
| 973 | sliceFFT = np.fft.rfft(sliceAudio, axis=0) |
| 974 | sliceMag = np.absolute(sliceFFT) * (2/sliceFFT.size) |
| 975 | _spectrogram[:, N] = 20*np.log10(sliceMag/dBRef) |
| 976 | |
| 977 | except IndexError: |
| 978 | sliceAudio = timeSignal[-winSize:] |
| 979 | sliceFFT = np.fft.rfft(sliceAudio, axis=0) |
| 980 | sliceMag = np.absolute(sliceFFT) * (2/sliceFFT.size) |
| 981 | _spectrogram[:, N] = 20*np.log10(sliceMag) |
| 982 | |
| 983 | return _spectrogram, _specTime, _specFreq |
| 984 | |
| 985 | |
| 986 | def waterfall(sigObjs, step=2 ** 9, n=2 ** 13, fmin=None, fmax=None, pmin=None, |