# Path: scikits/talkbox/spectral/basic.py
# def periodogram(x, nfft=None, fs=1):
#     """Compute the periodogram of the given signal, with the given fft size.
# 
#     Parameters
#     ----------
#     x : array-like
#         input signal
#     nfft : int
#         size of the fft to compute the periodogram. If None (default), the
#         length of the signal is used. if nfft > n, the signal is 0 padded.
#     fs : float
#         Sampling rate. By default, is 1 (normalized frequency. e.g. 0.5 is the
#         Nyquist limit).
# 
#     Returns
#     -------
#     pxx : array-like
#         The psd estimate.
#     fgrid : array-like
#         Frequency grid over which the periodogram was estimated.
# 
#     Examples
#     --------
#     Generate a signal with two sinusoids, and compute its periodogram:
# 
#     >>> fs = 1000
#     >>> x = np.sin(2 * np.pi  * 0.1 * fs * np.linspace(0, 0.5, 0.5*fs))
#     >>> x += np.sin(2 * np.pi  * 0.2 * fs * np.linspace(0, 0.5, 0.5*fs))
#     >>> px, fx = periodogram(x, 512, fs)
# 
#     Notes
#     -----
#     Only real signals supported for now.
# 
#     Returns the one-sided version of the periodogram.
# 
#     Discrepency with matlab: matlab compute the psd in unit of power / radian /
#     sample, and we compute the psd in unit of power / sample: to get the same
#     result as matlab, just multiply the result from talkbox by 2pi"""
#     # TODO: this is basic to the point of being useless:
#     #   - support Daniel smoothing
#     #   - support windowing
#     #   - trend/mean handling
#     #   - one-sided vs two-sided
#     #   - plot
#     #   - support complex input
#     x = np.atleast_1d(x)
#     n = x.size
# 
#     if x.ndim > 1:
#         raise ValueError("Only rank 1 input supported for now.")
#     if not np.isrealobj(x):
#         raise ValueError("Only real input supported for now.")
#     if not nfft:
#         nfft = n
#     if nfft < n:
#         raise ValueError("nfft < signal size not supported yet")
# 
#     pxx = np.abs(fft(x, nfft)) ** 2
#     if nfft % 2 == 0:
#         pn = nfft / 2 + 1
#     else:
#         pn = (nfft + 1 )/ 2
# 
#     fgrid = np.linspace(0, fs * 0.5, pn)
#     return pxx[:pn] / (n * fs), fgrid


import numpy as np
import matplotlib.pyplot as plt
from scikits.talkbox.spectral.basic import periodogram
from scipy.signal import hamming, hanning
fs = 1000
x = np.sin(2 * np.pi * 0.15 * fs * np.linspace(0., 0.3, 0.3 * fs))
x += 0.1 * np.random.randn(x.size)
px1, fx1 = periodogram(x, nfft=16384, fs=fs)

# Path: scikits/talkbox/spectral/basic.py
# def periodogram(x, nfft=None, fs=1):
#     """Compute the periodogram of the given signal, with the given fft size.
# 
#     Parameters
#     ----------
#     x : array-like
#         input signal
#     nfft : int
#         size of the fft to compute the periodogram. If None (default), the
#         length of the signal is used. if nfft > n, the signal is 0 padded.
#     fs : float
#         Sampling rate. By default, is 1 (normalized frequency. e.g. 0.5 is the
#         Nyquist limit).
# 
#     Returns
#     -------
#     pxx : array-like
#         The psd estimate.
#     fgrid : array-like
#         Frequency grid over which the periodogram was estimated.
# 
#     Examples
#     --------
#     Generate a signal with two sinusoids, and compute its periodogram:
# 
#     >>> fs = 1000
#     >>> x = np.sin(2 * np.pi  * 0.1 * fs * np.linspace(0, 0.5, 0.5*fs))
#     >>> x += np.sin(2 * np.pi  * 0.2 * fs * np.linspace(0, 0.5, 0.5*fs))
#     >>> px, fx = periodogram(x, 512, fs)
# 
#     Notes
#     -----
#     Only real signals supported for now.
# 
#     Returns the one-sided version of the periodogram.
# 
#     Discrepency with matlab: matlab compute the psd in unit of power / radian /
#     sample, and we compute the psd in unit of power / sample: to get the same
#     result as matlab, just multiply the result from talkbox by 2pi"""
#     # TODO: this is basic to the point of being useless:
#     #   - support Daniel smoothing
#     #   - support windowing
#     #   - trend/mean handling
#     #   - one-sided vs two-sided
#     #   - plot
#     #   - support complex input
#     x = np.atleast_1d(x)
#     n = x.size
# 
#     if x.ndim > 1:
#         raise ValueError("Only rank 1 input supported for now.")
#     if not np.isrealobj(x):
#         raise ValueError("Only real input supported for now.")
#     if not nfft:
#         nfft = n
#     if nfft < n:
#         raise ValueError("nfft < signal size not supported yet")
# 
#     pxx = np.abs(fft(x, nfft)) ** 2
#     if nfft % 2 == 0:
#         pn = nfft / 2 + 1
#     else:
#         pn = (nfft + 1 )/ 2
# 
#     fgrid = np.linspace(0, fs * 0.5, pn)
#     return pxx[:pn] / (n * fs), fgrid


# Path: docs/src/examples/periodogram_2.py
import numpy as np
import matplotlib.pyplot as plt
from scikits.talkbox.spectral.basic import periodogram
from scipy.signal import hamming, hanning

fs = 1000
x = np.sin(2 * np.pi * 0.15 * fs * np.linspace(0., 0.3, 0.3 * fs))
x += 0.1 * np.random.randn(x.size)
px1, fx1 = periodogram(x, nfft=16384, fs=fs)

px2, fx2 = periodogram(x * hamming(x.size), nfft=16384, fs=fs)