python - 如何使用 numpy 在频率范围内产生噪声?

标签 python numpy signal-processing noise

我有一个主信号,例如周期为 200 个样本的正弦波。

我想给这个信号添加一个噪音。 “噪声信号部分”的周期应在例如 5-30 个样本的范围内。

我认为这足以在此范围内生成具有不同随机选择幅度的多个窦:

noise = np.sin(np.array(range(N))/0.7)*np.random.random(1) + np.sin(np.array(range(N))/1.1)*np.random.random(1) + np.sin(np.array(range(N))/1.5)*np.random.random(1) 

但对于我的目的来说,这个解决方案仍然过于“确定性”。

我如何生成振幅和周期随机变化的噪声?

最佳答案

在 MathWorks 的文件交换中:fftnoise - generate noise with a specified power spectrum您可以找到 Aslak Grinsted 的 matlab 代码,创建具有指定功率谱的噪声。它可以很容易地移植到 python:

def fftnoise(f):
    f = np.array(f, dtype='complex')
    Np = (len(f) - 1) // 2
    phases = np.random.rand(Np) * 2 * np.pi
    phases = np.cos(phases) + 1j * np.sin(phases)
    f[1:Np+1] *= phases
    f[-1:-1-Np:-1] = np.conj(f[1:Np+1])
    return np.fft.ifft(f).real

您可以像这样在您的案例中使用它:

def band_limited_noise(min_freq, max_freq, samples=1024, samplerate=1):
    freqs = np.abs(np.fft.fftfreq(samples, 1/samplerate))
    f = np.zeros(samples)
    idx = np.where(np.logical_and(freqs>=min_freq, freqs<=max_freq))[0]
    f[idx] = 1
    return fftnoise(f)

据我所知似乎有效。聆听您刚创建的噪音:

from scipy.io import wavfile

x = band_limited_noise(200, 2000, 44100, 44100)
x = np.int16(x * (2**15 - 1))
wavfile.write("test.wav", 44100, x)

关于python - 如何使用 numpy 在频率范围内产生噪声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933842/

相关文章:

python - 根据条件将数据帧的值移动到列表

python - 如何有效地执行这个 numpy 数组操作?

Python DSP,自动增益控制(AGC)

python - 为什么 sys.getrefcount 会给出巨大的值?

python - 使用正则表达式进行 BeautifulSoup 时,连字符 '-' 会产生问题

python - 如何从用户那里获取多行输入

python - 在 Pandas 中合并数据帧时的组合爆炸

opencv - 频域滤波opencv c++?

machine-learning - HTK 扬声器适配

python - 如何为模块内的所有测试定义设置和拆除