我正在编写一些代码来恢复测试图像相对于使用相位相关的模板的旋转、缩放和平移,a la Reddy & Chatterji 1996。我采用原始测试图像的 FFT 以找到比例因子和旋转角度,但我需要旋转和缩放的测试图像的 FFT以获得平移。
现在我可以在空间域中应用旋转和缩放,然后进行 FFT,但这似乎有点低效 - 是否可以直接在频域中获得旋转/缩放图像的傅立叶系数?
编辑 1: 好的,我按照 user1816548 的建议进行了尝试。对于 90 度的倍数,我可以得到模糊合理的旋转,尽管图像的极性发生了奇怪的变化。不是 90o 倍数的角度给了我非常滑稽的结果。
编辑 2: 我对图像应用了零填充,并且在旋转 FFT 时将其边缘包裹起来。我很确定我正在围绕 FFT 的 DC 分量旋转,但是对于不是 90o 倍数的角度,我仍然得到奇怪的结果。
示例输出:

可执行的 Numpy/Scipy 代码:
import numpy as np
from scipy.misc import lena
from scipy.ndimage.interpolation import rotate,zoom
from scipy.fftpack import fft2,ifft2,fftshift,ifftshift
from matplotlib.pyplot import subplots,cm
def testFourierRotation(angle):
M = lena()
newshape = [2*dim for dim in M.shape]
M = procrustes(M,newshape)
# rotate, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用流异步启动多个CUDA FFT内核.为此,我正在创建我的流,cuFFT前向和反向计划如下:
streams = (cudaStream_t*) malloc(sizeof(cudaStream_t)*streamNum);
plansF = (cufftHandle *) malloc(sizeof(cufftHandle)*streamNum);
plansI = (cufftHandle *) malloc(sizeof(cufftHandle)*streamNum);
for(int i=0; i<streamNum; i++)
{
cudaStreamCreate(&streams[i]);
CHECK_ERROR(5)
cufftPlan1d(&plansF[i], ticks, CUFFT_R2C,1);
CHECK_ERROR(5)
cufftPlan1d(&plansI[i], ticks, CUFFT_C2R,1);
CHECK_ERROR(5)
cufftSetStream(plansF[i],streams[i]);
CHECK_ERROR(5)
cufftSetStream(plansI[i],streams[i]);
CHECK_ERROR(5)
}
Run Code Online (Sandbox Code Playgroud)
在main函数中,我正在启动正向FFT,如下所示:
for(w=1;w<q;w++)
{
cufftExecR2C(plansF[w], gpuMem1+k,gpuMem2+j);
CHECK_ERROR(8)
k += rect_small_real;
j += rect_small_complex;
}
Run Code Online (Sandbox Code Playgroud)
我还有其他内核,我使用相同的流异步启动.
当我使用Visual Profiler 5.0分析我的应用程序时,我发现除了CUDA FFT(正向和反向)之外的所有内核并行运行并重叠.FFT内核确实在不同的流中运行,但它们不重叠,因为它们实际上是顺序运行的.谁能告诉我我的问题是什么?
我的环境是VS 2008,64位,Windows 7.
谢谢.
之前,我问过使用FFT和Complex类获取频率wav音频的问题,
在那里,我需要从AudioRecord输入计算FFT值 - >从麦克风,我以某种方式设法获得FFT值...
现在我需要从之前保存的*.wav音频文件中计算FFT值,我将音频保存在我项目'res'文件夹内'raw'文件夹中
我仍然使用相同的FFT类:http://www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我使用这种方法从我的原始文件中读取音频文件,然后我调用方法calculateFFT来使用它
private static final int RECORDER_BPP = 16;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private void asli(){
int counter = 0;
int data;
InputStream inputStream = getResources().openRawResource(R.raw.b1);
DataInputStream dataInputStream = new DataInputStream(inputStream);
List<Integer> content = new ArrayList<Integer>();
try {
while ((data = dataInputStream.read()) != -1) {
content.add(data);
counter++; }
} …Run Code Online (Sandbox Code Playgroud) 在 Python 中,我有一个代表模拟信号电压的浮点数组。
谁能解释一下如何将数组更改为 .wav 格式?我已经看到了, 在添加标头之前,我首先需要将数据格式从 [1.23,1.24,1.25,1.26] (例如)更改为 1.231.241.251.26,以便正确读取吗?我最终计划对这些值使用 FFT 来导出基频,在这种情况下是否有更好的方法来存储这些值?
谢谢
我正在网上找到一个很好的FFT库,看看我是否可以编写音高检测程序.到目前为止,我已经能够成功地让磁带库对包含少量正弦波的测试音频信号进行FFT计算,包括440Hz的一个正弦波(我使用16384个样本作为大小,采样率为44100Hz).
FFT输出如下:
433.356Hz - Real: 590.644 - Imag: -27.9856 - MAG: 16529.5
436.047Hz - Real: 683.921 - Imag: 51.2798 - MAG: 35071.4
438.739Hz - Real: 4615.24 - Imag: 1170.8 - MAG: 5.40352e+006
441.431Hz - Real: -3861.97 - Imag: 2111.13 - MAG: 8.15315e+006
444.122Hz - Real: -653.75 - Imag: 341.107 - MAG: 222999
446.814Hz - Real: -564.629 - Imag: 186.592 - MAG: 105355
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,441.431Hz和438.739Hz频段都显示出相同的高幅度输出("MAG:"后面的最右侧数字),因此很明显目标频率440Hz介于两者之间.提高分辨率可能是一种关闭方式,但这会增加计算时间.
如何计算两个频率箱之间的确切频率?
更新:
我在DSPGuru网站上尝试了Barry Quinn的"Second Estimator",并取得了优异的成绩.以下显示440Hz方波的结果 - 现在我只有0.003Hz!
我是傅立叶理论的新手,我看过关于如何将 fft 应用于信号并绘制它以查看它包含的频率的非常好的教程。不知何故,他们所有人都创建了混合正弦作为他们的数据,我无法将其适应我的真正问题。
我每天有 242 次每小时观察,这意味着我的周期是 24。所以我希望在我的 fft 图中有一个大约 24 的峰值。
我的 data.csv 示例在这里:https ://pastebin.com/1srKFpJQ
绘制的数据:

我的代码:
data = pd.read_csv('data.csv',index_col=0)
data.index = pd.to_datetime(data.index)
data = data['max_open_files'].astype(float).values
N = data.shape[0] #number of elements
t = np.linspace(0, N * 3600, N) #converting hours to seconds
s = data
fft = np.fft.fft(s)
T = t[1] - t[0]
f = np.linspace(0, 1 / T, N)
plt.ylabel("Amplitude")
plt.xlabel("Frequency [Hz]")
plt.bar(f[:N // 2], np.abs(fft)[:N // 2] * 1 / N, width=1.5) # 1 / N …Run Code Online (Sandbox Code Playgroud) 假设有人想找出给定正弦波信号的周期。从我在网上阅读的内容来看,这两种主要方法似乎采用了傅立叶分析或自相关。我正在尝试使用 python 自动化该过程,我的用例是将此概念应用于来自围绕恒星运行的模拟物体的位置(或速度或加速度)时间序列的类似信号。
为了简单的例子,考虑x = sin(t)for 0 ? t ? 10 pi。
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
## sample data
t = np.linspace(0, 10 * np.pi, 100)
x = np.sin(t)
fig, ax = plt.subplots()
ax.plot(t, x, color='b', marker='o')
ax.grid(color='k', alpha=0.3, linestyle=':')
plt.show()
plt.close(fig)
Run Code Online (Sandbox Code Playgroud)
给定形式x = a sin(b(t+c)) + d为 的正弦波,正弦波的周期为2 * pi / b。由于b=1(或通过目视检查),我们的正弦波的周期是2 * pi。我可以根据此基线检查从其他方法获得的结果。
尝试 1:自相关
据我了解(如果我错了,请纠正我),相关性可用于查看一个信号是否是另一个信号的时间滞后副本(类似于余弦和正弦因相位差而不同)。因此,自相关是针对自身测试信号,以测量时滞重复所述信号的时间。使用此处发布的示例 …
我正在从以 200 Hz 采样的 X、Y 和 Z 加速度计传感器收集数据。3 个轴组合成一个称为“XYZ_Acc”的信号。我遵循了有关如何使用 scipy fftpack 库将时域信号转换为频域的教程。
我正在使用的代码如下:
from scipy.fftpack import fft
# get a 500ms slice from dataframe
sample500ms = df.loc[pd.to_datetime('2019-12-15 11:01:31.000'):pd.to_datetime('2019-12-15 11:01:31.495')]['XYZ_Acc']
f_s = 200 # sensor sampling frequency 200 Hz
T = 0.005 # 5 milliseconds between successive observation T =1/f_s
N = 100 # 100 samples in 0.5 seconds
f_values = np.linspace(0.0, f_s/2, N//2)
fft_values = fft(sample500ms)
fft_mag_values = 2.0/N * np.abs(fft_values[0:N//2])
Run Code Online (Sandbox Code Playgroud)
然后我绘制频率与幅度
fig_fft = plt.figure(figsize=(5,5))
ax = fig_fft.add_axes([0,0,1,1])
ax.plot(f_values,fft_mag_values)
Run Code Online (Sandbox Code Playgroud)
截屏: …
我需要在 Python 中实现低通滤波器,但我唯一可以使用的模块是 numpy (不是 scipy)。我尝试np.fft.fft()在信号上使用,然后将所有高于截止频率的频率设置为 0,然后使用np.fft.ifft(). 然而这不起作用,我根本不知道如何应用过滤器。
编辑:
更改后np.abs()结果np.real()几乎是正确的。但在频谱图中,幅度小于原始参考和滤波参考中的幅度(相差 6dB)。所以看起来好像并不完全正确。有什么想法可以解决这个问题吗?
我的低通函数应采用以下参数:
signal: audio signal to be filtered
cutoff_freq: cout off frequency in Hz above which to cut off frequencies
sampling_rate: sampling rate in samples/second
Run Code Online (Sandbox Code Playgroud)
应返回filterd 信号。
我当前的功能
signal: audio signal to be filtered
cutoff_freq: cout off frequency in Hz above which to cut off frequencies
sampling_rate: sampling rate in samples/second
Run Code Online (Sandbox Code Playgroud) 我试图将信号中存在的周期性分解为其各个组成部分,以计算它们的时间周期。
假设以下是我的示例信号:
您可以使用以下代码重现信号:
t_week = np.linspace(1,480, 480)
t_weekend=np.linspace(1,192,192)
T=96 #Time Period
x_weekday = 10*np.sin(2*np.pi*t_week/T)+10
x_weekend = 2*np.sin(2*np.pi*t_weekend/T)+10
x_daily_weekly_sinu = np.concatenate((x_weekday, x_weekend))
#Creating the Signal
x_daily_weekly_long_sinu = np.concatenate((x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu))
#Visualization
plt.plot(x_daily_weekly_long_sinu)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我的目标是将这个信号分成 3 个独立的隔离分量信号,其中包括:
期间如下图:
我尝试使用statsmodel中的STL分解方法:
sm.tsa.seasonal_decompose()
Run Code Online (Sandbox Code Playgroud)
但这仅适用于您事先知道周期的情况。并且仅适用于一次分解一个周期。同时,我需要分解任何具有多个周期性且其周期事先未知的信号。
谁能帮助如何实现这一目标?