在2d矩阵中找到脉冲峰(dirac delta)的最佳方法是什么.
更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值DFT中找到脉冲峰值.
我想过使用findpeaks,但没有2d版本.我还看到了有关使用imdilate和/或imextendedmax查找普通峰值的早期帖子,但是那些找到了2d矩阵中的所有峰值,而我只对脉冲峰值感兴趣.我相信DSP人有一个共同的配方...
请帮忙,
谢谢
我有速度与时间的数据。时间步长不一致,但是力度数据是波动的。如何使用Python的FFT计算速度的主频率?我在网上看到的大多数示例都是为了统一时间。
我的数据就像
7.56683038E+02 2.12072850E-01
7.56703750E+02 2.13280844E-01
7.56724461E+02 2.14506402E-01
7.56745172E+02 2.15748934E-01
7.56765884E+02 2.17007907E-01
7.56786595E+02 2.18282753E-01
Run Code Online (Sandbox Code Playgroud)
像这样的10000行。
看到一些在线响应,我编写了如下代码,但它不起作用:
#!/usr/bin/env python
import numpy as np
import scipy as sy
import scipy.fftpack as syfp
import pylab as pyl
# Calculate the number of data points
length = 0
for line in open("data.dat"):
length = length + 1
# Read in data from file here
t = np.zeros(shape=(length,1))
u = np.zeros(shape=(length,1))
length = 0
for line in open("data.dat"):
columns = line.split(' ')
t[length] = float(columns[0]) …Run Code Online (Sandbox Code Playgroud) 我想改变频域中信号的相位.所以我生成了一个余弦测试信号来验证代码:
ycheck = cos(2*pi*t);
Run Code Online (Sandbox Code Playgroud)
当我想将相位移动到pi/4时,我会对信号执行fft,将其分为幅度和相位,并从中减去pi/4.
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
Run Code Online (Sandbox Code Playgroud)
绘制结果,看起来只有信号的幅度降低,但没有发生相移.我在论坛上做了一些研究,发现这个帖子在频域(MatLab)中改变信号的相位.所以我使用以下方法生成了另一个testignal:
y = exp(1i*2*pi*t);
Run Code Online (Sandbox Code Playgroud)
当我用这个信号进行相移时,它会给出所需的结果.遗憾的是我不能张贴图片:(,所以我试着描述(代码是附加的,所以你可以执行它):只有想象术语的ifft正确移动.标准余弦的ifft只降低幅度.我不明白,这里的问题是什么.
我的问题是,为什么相移对假想项中表示的信号起作用而不是对常规生成的余弦表示?我的计划是将这种相移应用于实际信号 - 我可以将频域中的相移应用于音乐信号,还是应用另一种(可能更智能)的方式?
我的代码在这里:
clear all;
close all;
clc;
N = 64; %number of samples
fs = 10; %sampling frequency
ts = 1/fs; %sample interval
tmax = (N-1)*ts;
t = 0:ts:tmax;
y = exp(1i*2*pi*t);
ycheck = cos(2*pi*t);
% plot test signals
figure
plot(t,y)
hold on
plot(t,ycheck,'r--')
% fft
Y = fft(y);
Ycheck = fft(ycheck);
% phase shift
Y = abs(Y).*exp(1i*angle(Y)-1i*pi/4); % -pi/4 …Run Code Online (Sandbox Code Playgroud) 我试图在20hz处计算正弦波的DFT.
首先,我用20赫兹的正弦函数填充一个std :: vector:
std::vector<double> sinx;
double samplerate = 1000.0;
double frequency = 20.0;
double num_cycles = 10.0;
for (int i=0; i<samplerate/frequency*num_cycles; i++){
sinx.push_back(sin(2.0*M_PI*((double)i)*frequency/samplerate));
}
double N = sinx.size();
Run Code Online (Sandbox Code Playgroud)
然后我启动FFTW输入和输出数组以及FFTW计划:
fftw_complex *in, *out;
fftw_plan p;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
Run Code Online (Sandbox Code Playgroud)
然后我用正弦波函数值填充输入数组:
for (int i=0; i<N; i++){
in[i][0] = sinx[i];
}
Run Code Online (Sandbox Code Playgroud)
然后我计算FFT:
fftw_execute(p);
Run Code Online (Sandbox Code Playgroud)
计算完FFT后,检查结果并清理.
double hz_per_index = samplerate/2.0/N*num_cycles;
for (int i=0; i<N/num_cycles; i++){
std::cout<<"hz: "<<hz_per_index*i<<" out: "<<fabs(out[i][0])<<" "<<out[i][1]<<" …Run Code Online (Sandbox Code Playgroud) 我一直试图找到一些地方来帮助我更好地理解DFT以及如何计算它但无济于事.所以我需要帮助理解DFT和它的复数计算.
基本上,我只是在寻找有关如何计算DFT的示例,并解释它是如何计算的,因为最后,我正在寻找创建算法来计算它.
我们已经实现了 DFT,并想用 OpenCV 的实现来测试它。结果不同。
这是我们对 DFT 的实现:
// complex number
std::complex<float> j;
j = -1;
j = std::sqrt(j);
std::complex<float> result;
std::vector<std::complex<float>> fourier; // output
// this->N = length of contour, 512 in our case
// foreach fourier descriptor
for (int n = 0; n < this->N; ++n)
{
// Summation in formula
for (int t = 0; t < this->N; ++t)
{
result += …Run Code Online (Sandbox Code Playgroud) 当使用librosa.stft()计算频谱,一个人如何找回相关的频率值?我对生成图像不感兴趣librosa.display.specshow,但我想掌握这些值。
y, sr = librosa.load('../recordings/high_pitch.m4a')
stft = librosa.stft(y, n_fft=256, window=sig.windows.hamming)
spec = np.abs(stft)
Run Code Online (Sandbox Code Playgroud)
spec给我每个频率的“幅度”或“功率”,但不是频率箱本身。我已经看到有一个display.specshow函数可以在热图的垂直轴上显示这些频率值,但不返回值本身。
我正在寻找类似于nn.fft.fttfreq()单个 FFT 的东西,但在librosa文档中找不到它的等价物。
我正在尝试在声音处理中进行一个项目,并且需要将频率放入另一个域.现在,我试图实现一个不顺利的FFT.我试图理解z-transform,这也不顺利.我读了一下,发现DFT更容易理解,尤其是算法.所以我使用示例对算法进行了编码,但我不知道或认为输出是正确的.(我这里没有Matlab,也找不到任何资源来测试它),并想知道你们是否知道我是否朝着正确的方向前进.到目前为止,这是我的代码:
#include <iostream>
#include <complex>
#include <vector>
using namespace std;
const double PI = 3.141592;
vector< complex<double> > DFT(vector< complex<double> >& theData)
{
// Define the Size of the read in vector
const int S = theData.size();
// Initalise new vector with size of S
vector< complex<double> > out(S, 0);
for(unsigned i=0; (i < S); i++)
{
out[i] = complex<double>(0.0, 0.0);
for(unsigned j=0; (j < S); j++)
{
out[i] += theData[j] * polar<double>(1.0, - 2 * PI * …Run Code Online (Sandbox Code Playgroud) 所以,我正在尝试编写一个算法croot(k,n),它返回n的第k个根,n == n.我得到了大多数正确的答案,但它给了我一些奇怪的陈述,这些陈述似乎对某些数字是错误的.这是一个例子.
import cmath
def croot(k, n):
if n<=0:
return None
return cmath.exp((2 * cmath.pi * 1j * k) / n)
for k in range(8):
print croot(k, 8)
Run Code Online (Sandbox Code Playgroud)
输出是:
(1+0j)
(0.70710...+0.70710...j)
(6.12323399574e-17+1j)
Run Code Online (Sandbox Code Playgroud)
哇哇哇哇 所以k = 2和n = 8时的根是错误的,因为它应该是i,它将表示为1j,或j,或1.00000j等.有人可以帮助我吗?我这样做是因为我正在尝试编写FFT算法.我对复杂的数字和Python不是很有经验,所以我很可能犯了一个简单的错误.
谢谢,
如果你们需要任何其他信息,请询问.
我试图在不使用matlab内置函数(如fft())的情况下实现一维DFT.这是我的代码
function [Xk] = dft1(xn)
N=length(xn);
n = 0:1:N-1; % row vector for n
k = 0:1:N-1; % row vecor for k
WN = exp(-1j*2*pi/N); % Twiddle factor (w)
nk = n'*k; % creates a N by N matrix of nk values
WNnk = WN .^ nk; % DFT matrix
Xk = (WNnk*xn );
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令后运行代码时:
I = imread('sample.jpg')
R = dft1(I)
Run Code Online (Sandbox Code Playgroud)
我得到这个特殊的错误: 整数类不完全支持使用*MTIMES的错误.至少一个输入必须是标量.要计算元素TIMES,请改用TIMES(.*).
有人可以帮我弄清楚如何解决这个问题
注意:我还在学习Matlab的最初阶段非常感谢你