我正在关注scipy.signal.spectrogram 上的教程示例。是否可以限制我们想要计算频谱图的频率,假设在 1000-2000Hz 范围内。根据 FFT,我们将获得一半的采样频率。如果不是,那么我可以对输出进行切片以获得 3D 矩阵,t,f,Sxx其中我将频率限制为 1000-2000 Hz?在我的情况下,我的信号仅包含特定范围的频率,并且保留所有频率对我的分析来说代价高昂。
我目前正在尝试使用Kiss FFT将FFT实施到AVR32微控制器中,以进行信号处理。而且我的输出有一个奇怪的问题。基本上,我会将ADC样本(使用函数发生器进行测试)传递到fft(真实输入,256 n大小)中,并且检索到的输出对我来说很有意义。但是,如果我将汉明窗应用于ADC样本,然后将其传递给FFT,则峰值幅度的频率仓是错误的(并且与之前没有开窗的结果不同)。ADC样本具有DC偏移,因此我消除了偏移,但仍不适用于窗口样本。
以下是通过rs485的前几个输出值。第一列是没有窗口的fft输出,而第二列是有窗口的输出。从第1列开始,峰值位于第6行(6 x fs(10.5kHz)/ 0.5N)为我提供了正确的输入频率结果,其中第2列在第2行具有峰值幅度(直流仓除外),这对我来说没有意义。任何建议都会有所帮助。提前致谢。
488260 //直流仓
5 97
5 41
5 29
4 26
10 35
133 76
33 28
21 6
17 3
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_input[n];
kiss_fft_cpx fft_output[n];
for(ctr=0; ctr<n; ctr++)
{
fft_input[ctr].r = zero;
fft_input[ctr].i = zero;
fft_output[ctr].r =zero;
fft_output[ctr].i = zero;
}
// IIR filter calculation
for (ctr=0; ctr<n; ctr++)
{
// filter calculation
y[ctr] = num_coef[0]*x[ctr];
y[ctr] += (num_coef[1]*x[ctr-1]) - (den_coef[1]*y[ctr-1]);
y[ctr] += (num_coef[2]*x[ctr-2]) - (den_coef[2]*y[ctr-2]);
//y1[ctr] += y[ctr] - 500; …Run Code Online (Sandbox Code Playgroud) 我用Matlab.
我有一个正弦信号:
X(放大器:220 /频率:50)
我添加了3个谐波:
x1 =>(h2)amp:30/Freq:100 /相位:30°
x2 =>(h4)amp:10/Freq:200 /相位:50°
x3 =>(h6)amp:05/Freq:300 /相位:90°
我将所有信号加在一起(如X包含3个谐波),结果信号称为:Xt
这是代码:
%% Original signal
X = 220.*sin(2 .* pi .* 50 .* t);
%% Harmonics
x1 = 30.*sin(2 .* pi .* 100 .* t + 30);
x2 = 10.*sin(2 .* pi .* 200 .* t + 50);
x3 = 05.*sin(2 .* pi .* 300 .* t + 90);
%% adding the harmonics
Xt = X + x1 + x2 + x3;
Run Code Online (Sandbox Code Playgroud)
我想要做的是:找到3个谐波信号(它们的幅度,频率和相位),从求和信号Xt开始,知道基波信号 …
我从传感器收到正弦数据,其形式为(A + B(sin(n/N+a))),其中 N 是样本总数,加上一些小噪声。我知道在N个样本(1000个样本)中,正弦波将完成一圈。信号如下所示:

我想使用尽可能少的数据来提取可变幅度“B”和相位“a”。换句话说,我想使用DSP尽快预测传感器的信号。我已经尝试过“相关性”,但没有用。
采用TMS320C000搭配FPU、TMU单元。
我正在尝试优化我给出的一些代码,其中 FFT 取自时间序列上的滑动窗口(作为列表给出),并且每个结果都累积到一个列表中。原代码如下:
def calc_old(raw_data):
FFT_old = list()
for i in range(0, len(raw_data), bf.WINDOW_STRIDE_LEN):
if (i + bf.WINDOW_LEN) >= len(raw_data):
# Skip the windows that would extend beyond the end of the data
continue
data_tmp = raw_data[i:i+bf.WINDOW_LEN]
data_tmp -= np.mean(data_tmp)
data_tmp = np.multiply(data_tmp, np.hanning(len(data_tmp)))
fft_data_tmp = np.fft.fft(data_tmp, n=ZERO_PAD_LEN)
fft_data_tmp = abs(fft_data_tmp[:int(len(fft_data_tmp)/2)])**2
FFT_old.append(fft_data_tmp)
Run Code Online (Sandbox Code Playgroud)
和新代码:
def calc_new(raw_data):
data = np.array(raw_data) # Required as the data is being handed in as a list
f, t, FFT_new = spectrogram(data,
fs=60.0,
window="hann",
nperseg=bf.WINDOW_LEN,
noverlap=bf.WINDOW_OVERLAP,
nfft=bf.ZERO_PAD_LEN, …Run Code Online (Sandbox Code Playgroud) 我以递归模式实现了两个函数 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) 我是处理信号的新手,需要您的帮助。
我从我的 TI AFE4490 获得了一个 10 秒的原始 PPG(光体积描记图)信号。我的硬件已经过校准,我每秒使用 250 个样本来记录这些信号。最后我获得了2500分。
您可以在下面看到图像、点和代码。
顶部:我的原始 PPG 信号 - 底部:尝试应用 FFT:

代码:
RED, IR, nSamples, sRate = getAFESignal()
period = 1/sRate
plt.figure(1)
plt.subplot(2,1,1)
x = np.linspace(0.0, nSamples*period, nSamples)
y = IR
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.plot(x,y)
plt.subplot(2,1,2)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*period), nSamples//2)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Gain")
plt.plot(xf, 2.0/nSamples * np.abs(yf[0:nSamples//2]))
plt.grid()
plt.show()
Run Code Online (Sandbox Code Playgroud)
该函数getAFEsignal()只是一个读取 .txt 文件并将所有内容放入两个 numpy 数组的函数。
在这里您可以找到 .txt 文件:原始信号文件
如您所见,我没有正确应用 FFT,我需要它来发现我需要过滤的频率。你知道我做错了什么吗,是否可以在这个信号上应用 FFT?
我在 Python 中有以下脚本。我正在计算数组的傅立叶变换。当我想绘制结果(傅立叶变换)时,我使用的是该计算的绝对值。但是,我不知道复数的绝对值是如何产生的。有谁知道它是如何计算的?我需要这个在 Java 中重现。
import numpy as np
import matplotlib.pyplot as plt
from numpy import fft
inp = [1,2,3,4]
res = fft.fft(inp)
print(res[1]) # returns (-2+2j) complex number
print(np.abs(res[1])) # returns 2.8284271247461903
Run Code Online (Sandbox Code Playgroud) 这次再次遇到路径查找问题
我已经在许多站点上阅读了Dijkstra的应用程序。对于Graph进行了大部分解释,并找出了从源节点到所有节点的最短路径。
我无法弄清楚的是如何使用Dijkstra在网格上进行路径查找,如Wikipedia图片中所述。
因为在网格上,我们只有一个目标,所以我们必须找出到源的最短距离。我无法将其与图表上的Dijkstra关联。没有标记为INFINITY或将距离与其他路径/节点进行比较的图块。
简而言之,问题是我们如何继续使用Dijkstra来使用定义了该算法的实际图形算法在网格中查找路径。我们是否像BFS一样进行处理,并称其为Dijkstra的网格,还是有区别?因为我无法找出任何:/
谢谢 :)
最近,我一直在尝试在STM32F4-Discovery评估板上进行FFT计算,然后将其发送到PC。我已经研究了我的问题-我认为制造商提供的FFT函数有问题。
我正在使用CMSIS-DSP库。目前,我一直在用代码生成样本(如果可以正常工作,我将通过麦克风进行采样)。
我正在使用,arm_rfft_fast_f32因为将来我的数据将是浮动的,但是我在输出数组中得到的结果是疯狂的(我认为)-我的频率低于0。
number_of_samples = 512; (l_probek in code)
dt = 1/freq/number_of_samples
Run Code Online (Sandbox Code Playgroud)
这是我的代码
float32_t buffer_input[l_probek];
uint16_t i;
uint8_t mode;
float32_t dt;
float32_t freq;
bool DoFlag = false;
bool UBFlag = false;
uint32_t rozmiar = 4*l_probek;
union
{
float32_t f[l_probek];
uint8_t b[4*l_probek];
}data_out;
union
{
float32_t f[l_probek];
uint8_t b[4*l_probek];
}data_mag;
union
{
float32_t f;
uint8_t b[4];
}czest_rozdz;
/* Pointers ------------------------------------------------------------------*/
arm_rfft_fast_instance_f32 S;
arm_cfft_radix4_instance_f32 S_CFFT;
uint16_t output;
/* ---------------------------------------------------------------------------*/
int main(void)
{
freq = 5000;
dt = 0.000000390625;
_GPIO();
_LED(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试分析每个1/3倍频程频带频率的幅度,因此我使用了许多带通Butterworth滤波器。但是,它们只能在三阶时以50 Hz的频率工作。我想使用6阶,但是由于某些原因,在1 kHz以下没有得到任何结果。
[fs, x_raw] = wavfile.read('ruido_rosa.wav')
x_max=np.amax(np.abs(x_raw))
x=x_raw/x_max
L=len(x)
# Creates the vector with all frequencies
f_center=np.array([50.12, 63.10, 79.43, 100, 125.89, 158.49, 199.53, 251.19, 316.23, 398.11, 501.19, 630.96, 794.33, 1000, 1258.9, 1584.9, 1995.3, 2511.9, 3162.3, 3981.1, 5011.9, 6309.6, 7943.3, 10000, 12589.3, 15848.9])
f_low=np.array([44.7, 56.2, 70.8, 89.1, 112, 141, 178, 224, 282, 355, 447, 562, 708, 891, 1120, 1410, 1780, 2240, 2820, 3550, 4470, 5620, 7080, 8910, 11200, 14100])
f_high=np.array([56.2, 70.8, 89.1, 112, 141, 178, 224, 282, 355, 447, 562, …Run Code Online (Sandbox Code Playgroud) 我正在为学校做练习,我遇到了一些问题:我不知道如何标记"从 - 到",就像ASCII(65-90)中的所有大写字母一样.我不能投入-,因为它意味着减去.到目前为止,这是我的程序:
#include <iostream.h>
int main()
{
char letter;
cout<<"Put in letter: ";
cin>>letter;
if (letter == 65)
cout<<"Letter is uppercase";
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如何逐字符扫描字符串并在单独的行中打印每个字符,我正在考虑将字符串存储在数组中,并使用for循环进行打印,但是我不知道如何...。 !!!
这是我的代码:
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string str;
char option;
cout << "Do you want to enter a string? \n";
cout << " Enter 'y' to enter string or 'n' to exit \n\n";
cin >> option ;
while ( option != 'n' & option != 'y')
{
cout << "Invalid option chosen, please enter a valid y or n \n";
cin >> option;
}
if (option == 'n')
return 1; …Run Code Online (Sandbox Code Playgroud)