生成具有特定傅立叶频谱的随机数

问题描述 投票:0回答:2

我有一组将用于模拟的随机数。但是,我需要这些数字具有特定的傅立叶频谱(看起来与我拥有的真实数据类似),但不改变随机数的相位。

有谁知道如何使用真实数据的傅里叶变换的幅度来为随机数生成近似相似的傅里叶谱?

我想做的是:

  1. 对实际数据进行傅里叶变换。

  2. 将真实数据的频谱 (|F(w)|) 乘以随机数的傅立叶变换。

  3. 计算相乘信号的傅里叶逆变换以获得随机数。

这个方法行得通吗?

对相位角有什么影响(如果有的话)?

欢迎任何有关不同方法的建议。

random fft
2个回答
1
投票

您的问题是一个经典问题,因为很多人都想生成具有特定功率谱密度的随机数。就我而言,我正在模拟随机的粗糙表面。我写了一篇论文讨论如何做到这一点: Chris A. Mack,“生成随机粗糙边缘、表面和体积”,应用光学,卷。 52,第 7 期(2013 年 3 月 1 日),第 1472-1480 页。 这篇论文的副本可以在我的网站上找到(论文#178): http://www.lithoguru.com/scientist/papers.html


0
投票

计算噪声信号的功率谱时,您会丢失相位信息。要合成具有相同功率谱的噪声,您实际上只需要生成随机相位信息,将其应用于功率谱的平方根,生成复谱,然后进行傅里叶逆变换。必须注意确保复数频谱遵守 ifft 生成实值的对称性要求。特别是,实部分量必须是对称的,而虚部分量必须是在频率原点上反对称的。下面的代码演示了如何生成与原始噪声样本具有相同功率谱的合成噪声。

import numpy as np
from numpy.fft import fft, ifft, fftshift

pnts = 1000
y = np.random.randn(pnts) # noise

spec = fftshift(fft(y)) # complex spectrum of noise
phase_initial = np.arctan2(spec.imag, spec.real)
spec_pow = spec * spec.conj() # power spectrum (phase info lost)

phase = 2*np.pi * np.random.rand(pnts//2) - np.pi # random positive frequency phase
p = 2*np.pi * np.random.rand(1) - np.pi # Nyquist frequency phase
phase = np.concatenate((p, -1*phase[:0:-1], phase)) # full phase (impose symmetry)

spec_ = np.sqrt(spec_pow) * np.exp(1j*phase) # synthetic complex spectrum
y_ = ifft(fftshift(spec_)) # synthetic noise with same power spectrum
© www.soinside.com 2019 - 2024. All rights reserved.