gaussian curve我正在尝试使用matlab的fft来获得。问题是,在一种情况下,我尝试通过除法来减少噪声F=dt.*F./exp(-1i.*nu.*T/2)是行不通的(img 1),而在第二种情况下,如果我试图获取 fft 结果的绝对值,我在图表中没有合适的比例(img 2)。
N=512;
T=10;
dt=T/(N-1);
t=linspace(-5,5,N);
f=exp(-t.^2);
F=fft(f);
F1=F(1:N/2+1);
F2=F(N/2+1:N);
F=[F2,F1];
dnu=(N-1)/(N*T);
nuNyq=1/(2*dt);
nu=-nuNyq+dnu*(0:N);
F=dt.*F;
%F=dt.*F./exp(-1i.*nu.*T/2);
y=linspace(-5,5,N);
F2=pi.^(1/2).*exp(-y.^2/4);
hold on
plot(y,F2);
%plot(nu,real(F),'r');
plot(nu,abs(F),'r');
legend('analiticFT','FFT')
xlim([-5 5])
hold off
Run Code Online (Sandbox Code Playgroud)
图片 1

图像2

我以递归模式实现了两个函数 FFT 和 InverseFFT。
这些是功能:
def rfft(a):
n = a.size
if n == 1:
return a
i = 1j
w_n = e ** (-2 * i * pi / float(n))
w = 1
a_0 = np.zeros(int(math.ceil(n / 2.0)), dtype=np.complex_)
a_1 = np.zeros(n / 2, dtype=np.complex_)
for index in range(0, n):
if index % 2 == 0:
a_0[index / 2] = a[index]
else:
a_1[index / 2] = a[index]
y_0 = rfft(a_0)
y_1 = rfft(a_1)
y = np.zeros(n, dtype=np.complex_)
for k in …Run Code Online (Sandbox Code Playgroud) 我知道original_image * filter = blur_image,*卷积在哪里。因此,filter = ifft(fft(blur)/fft(original))
我有一个原始图像、已知的滤镜和已知的模糊图像。我尝试了以下代码。我只想比较使用 fft 和 ifft 计算的滤波器,并将其与已知的滤波器进行比较。我在Matlab中尝试过:
orig = imread("orig.png")
blur = imread("blur.png")
fftorig = fft(orig)
fftblur = fft(blur)
div = fftblur/fftorig
conv = ifft(div)
Run Code Online (Sandbox Code Playgroud)
结果没有意义。我看到div包含很多NaN值,并且fftblur和fftorig都包含很多 0 值。我需要对此做些什么吗?比如使用fftshift?
编辑:为了使这一点更容易理解,我现在使用以下图像: http: //matlabgeeks.com/tips-tutorials/how-to-blur-an-image-with-a-fourier-transform-in- matlab-第一部分/
我决定使用以下链接计算origimage和的内核:blurimageunpad
kernelc = real(ifft2(fft2(origimage)./fft2(blurimageunpad));
imagesc(kernelc)
colormap gray
Run Code Online (Sandbox Code Playgroud)
结果如下:
https://i.stack.imgur.com/kJavg.jpg
这显然与该链接顶部提到的高斯模糊不匹配
TensorFlow.conv2d()对于将大图像与大内核(滤波器)进行卷积来说,速度慢得不切实际。将 1024x1024 图像与相同大小的内核进行卷积需要几分钟。为了进行比较,cv2.filter2D()立即返回结果。
我发现tf.fft2()和tf.rfft()。
然而,我不清楚如何使用这些函数执行简单的图像过滤。
如何使用 FFT 通过 TensorFlow 实现快速 2D 图像过滤?
我想知道应该如何解释 skimage 的氡变换的结果。该文档并不十分精确。
让我们以这张图片为例。
这两条线由右侧图中的黑点表示。一条线为 45 度,另一条线为 135 度。现在,另一个坐标意味着什么?两条线都显示 ~150。为什么?
我首先查看了此链接: https: //www.mathworks.com/help/images/detect-lines-using-the-radon-transform.html 该代码位于matlab中,而不是来自skimage。所提出的解释值的方法不适用于我的示例。(很可能是因为它与matlab中的算法不完全相同。至少返回值不同)skimage的文档仅显示了一个简单的代码示例。不幸的是没有解释。
那么,150是什么意思呢?我该如何解释该值,或者如果只给我正确的图像。我将如何创建左边的?提前致谢
正如您可能注意到的,我对 python 和声音处理非常陌生。我(希望)使用 python 以及 logfbank 和 mfcc 函数从波形文件中提取 FFT 数据。(logfbank 似乎提供了最有希望的数据,mfcc 输出对我来说看起来有点奇怪)。
在我的程序中,我想更改 logfbank/mfcc 数据,然后从中创建波形数据(并将它们写入文件中)。我确实没有找到任何有关从 FFT 数据创建波形数据的过程的信息。你们中有人知道如何解决这个问题吗?我将非常感激:)
到目前为止,这是我的代码:
from scipy.io import wavfile
import numpy as np
from python_speech_features import mfcc, logfbank
rate, signal = wavfile.read('orig.wav')
fbank = logfbank(signal, rate, nfilt=100, nfft=1400).T
mfcc = mfcc(signal, rate, numcep=13, nfilt=26, nfft=1103).T
#magic data processing of fbank or mfcc here
#creating wave data and writing it back to a .wav file here
Run Code Online (Sandbox Code Playgroud) 下面是比较 fft 相位图与 2 种不同方法的代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack
phase = np.pi / 4
f = 1
fs = f*20
dur=10
t = np.linspace(0, dur, num=fs*dur, endpoint=False)
y = np.cos(2 * np.pi * t + phase)
Y = scipy.fftpack.fftshift(scipy.fftpack.fft(y))
f = scipy.fftpack.fftshift(scipy.fftpack.fftfreq(len(t)))
p = np.angle(Y)
p[np.abs(Y) < 1] = 0
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, y)
ax[1].plot(f*fs, p, label='from fft')
ax[1].phase_spectrum(y, fs, window=None, label='from phase_spectrum')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是结果:
这是当信号周期数不是整数时的结果:
我有几个问题:
我目前正在研究一个问题,涉及使用FFTW与 MPI 结合计算二维矩阵的傅里叶变换。
根据FFTW 文档本页的第一部分,计算矩阵的 FT 需要在并行时启动的进程之间进行大量通信。例如,在矩阵的情况下,例如
1,2,3
4,5,6
7,8,9
Run Code Online (Sandbox Code Playgroud)
我们决定用三个进程来计算 FFT,每个进程都会获取该矩阵的一个块,以便数据作为 存储在每个进程的本地内存中P_0 [1,2,3], P_1 [4,5,6], P_3 [7,8,9]。
计算初始傅立叶变换后,计算转置,这需要在三个进程之间通信计算数据,如下所示:
P_0 -> P_1: 2
P_0 -> P_2: 3
P_1 -> P_0: 4
P_1 -> P_2: 6
P_2 -> P_0: 7
P_2 -> P_1: 8
Run Code Online (Sandbox Code Playgroud)
由于这会产生很大的开销,因此上述 FFTW 文档页面的第二部分建议直接在傅里叶空间中计算转置,以大大减少所需的跨进程通信量。
我仍然不确定为什么首先需要计算转置,以及最终如何合并从矩阵的不同块计算的数据。为什么设置FFTW_MPI_TRANSPOSED_OUT和FFTW_MPI_TRANSPOSED_IN标志就足够了,不再需要跨进程通信,即使在进程之前需要来自所有其他进程的更多数据?
我正在开发一个使用 FFT 数学的项目,遇到需要计算实部和虚部 FFT 分量的相位角的情况。在一些示例中,我看到人们使用 atan2f 来执行此操作,而在一些示例中,我看到人们将 argf 与复数类一起使用。
\n除了采用两个单独的参数与单个复数参数之外,这两个函数的操作方式有什么区别吗?如果是这样,有什么区别?
\n一直在网上搜索各种文档,似乎无法找到这个问题的清晰或简洁的答案。
\n谢谢!
\n这个来源特别令人困惑:
\n\n\n如果没有错误发生,则返回区间 [\xe2\x88\x92\xcf\x80; 中 z 的相位角;\xcf\x80]。\n处理错误和特殊情况,就像函数实现为 std::atan2(std::imag(z), std::real(z)) 一样。
\n
目前尚不清楚它们是否在所有情况下都等效,或者仅在存在边缘情况或错误时等效。
\nfft ×10
python ×6
matlab ×2
numpy ×2
c++ ×1
convolution ×1
fftw ×1
fortran ×1
ifft ×1
matrix ×1
mfcc ×1
mpi ×1
phase ×1
python-2.7 ×1
scikit-image ×1
scipy ×1
spectrogram ×1
std ×1
tensorflow ×1