标签: fft

图像旋转和缩放频域?

我正在编写一些代码来恢复测试图像相对于使用相位相关的模板的旋转、缩放和平移,a la Reddy & Chatterji 1996。我采用原始测试图像的 FFT 以找到比例因子和旋转角度,但我需要旋转和缩放的测试图像的 FFT以获得平移。

现在我可以在空间域中应用旋转和缩放,然后进行 FFT,但这似乎有点低效 - 是否可以直接在频域中获得旋转/缩放图像的傅立叶系数?

编辑 1: 好的,我按照 user1816548 的建议进行了尝试。对于 90 度的倍数,我可以得到模糊合理的旋转,尽管图像的极性发生了奇怪的变化。不是 90o 倍数的角度给了我非常滑稽的结果。

编辑 2: 我对图像应用了零填充,并且在旋转 FFT 时将其边缘包裹起来。我很确定我正在围绕 FFT 的 DC 分量旋转,但是对于不是 90o 倍数的角度,我仍然得到奇怪的结果。

示例输出:


10°旋转角度

可执行的 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)

math numpy transformation fft image-processing

7
推荐指数
2
解决办法
9390
查看次数

cuFFT和流

我正在尝试使用流异步启动多个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.

谢谢.

cuda fft

7
推荐指数
2
解决办法
3910
查看次数

从音频文件计算FFT

之前,我问过使用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)

java audio fft audiotrack

7
推荐指数
1
解决办法
2万
查看次数

Python 将数组转换为 Wav

在 Python 中,我有一个代表模拟信号电压的浮点数组。

谁能解释一下如何将数组更改为 .wav 格式?我已经看到了 在添加标头之前,我首先需要将数据格式从 [1.23,1.24,1.25,1.26] (例如)更改为 1.231.241.251.26,以便正确读取吗?我最终计划对这些值使用 FFT 来导出基频,在这种情况下是否有更好的方法来存储这些值?

谢谢

python arrays audio fft

7
推荐指数
1
解决办法
1万
查看次数

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频率估算成功

这是我使用的代码.我只是改编了我发现的这个例子,这是针对Swift的.谢谢大家的宝贵意见,这是一次很棒的学习之旅:)

signal-processing fft

7
推荐指数
1
解决办法
1460
查看次数

Python 中的快速傅立叶变换

我是傅立叶理论的新手,我看过关于如何将 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 numpy fft

7
推荐指数
1
解决办法
5759
查看次数

如何找到信号周期(自相关 vs 快速傅立叶变换 vs 功率谱密度)?

假设有人想找出给定正弦波信号的周期。从我在网上阅读的内容来看,这两种主要方法似乎采用了傅立叶分析或自相关。我正在尝试使用 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:自相关

据我了解(如果我错了,请纠正我),相关性可用于查看一个信号是否是另一个信号的时间滞后副本(类似于余弦和正弦因相位差而不同)。因此,自相关是针对自身测试信号,以测量时滞重复所述信号的时间。使用此处发布示例 …

python signals waveform fft time-series

7
推荐指数
1
解决办法
3583
查看次数

如何从FFT中提取特征?

我正在从以 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 fft feature-extraction scipy

7
推荐指数
1
解决办法
2270
查看次数

Python:仅使用 numpy 的低通滤波器

我需要在 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)

python numpy fft lowpass-filter

7
推荐指数
2
解决办法
1万
查看次数

如何在不指定周期的情况下分解数据中存在的多个周期性?

我试图将信号中存在的周期性分解为其各个组成部分,以计算它们的时间周期。

假设以下是我的示例信号:

在此输入图像描述

您可以使用以下代码重现信号:

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 个独立的隔离分量信号,其中包括:

  1. 天数作为期间
  2. 工作日作为期间
  3. 周末作为期间

期间如下图:

在此输入图像描述

我尝试使用statsmodel中的STL分解方法:

sm.tsa.seasonal_decompose()
Run Code Online (Sandbox Code Playgroud)

但这仅适用于您事先知道周期的情况。并且仅适用于一次分解一个周期。同时,我需要分解任何具有多个周期性且其周期事先未知的信号。

谁能帮助如何实现这一目标?

python signal-processing numpy fft autocorrelation

7
推荐指数
1
解决办法
574
查看次数