快速傅里叶变换及python代码实现

分数阶傅里叶变换(FrFT)详细原理与matlab代码实现 本文主要是基于Haldun M. Ozaktas, Orhan等人的论文Digital Computation of the Fractional Fourier Transform 翻译而成。如有错误之处还请指出。 摘要 本文给出了一种高效、精确计算分数傅里叶变换的算法。对于时间带宽积为N的信号,该算法计算复杂度为O(N logN)。我们还讨论了离散分数傅里叶变换的定义。 引言 略…… 预备知识 分数傅里叶变换 定义{Ff}(x)\{\mathcal{F}f\}(x){Ff}(x)表示对f(x)f(x)f 阅读详情

文章来源:https://www.cnblogs.com/LXP-Never/p/11558302.html


快速傅里叶变换及python代码实现

目录

一、前言
  傅里叶变换相关函数
  基于傅里叶变换的频域滤波
  离散傅里叶变换(DFT)
二、短时傅里叶变换stft
三、frequency bin
参考

一、前言

  我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我会通过前言普及一下相关知识。

  我们复习一下三角函数的标准式:

y=Acos(ωx+θ)+ky=Acos⁡(ωx+θ)+k

  AA代表振幅,函数周期是2πw2πw,频率是周期的倒数w2πw2π,θθ是函数初相位,kk在信号处理中称为直流分量。这个信号在频域就是一条竖线。

  我们再来假设有一个比较复杂的时域函数y=f(t)y=f(t),根据傅里叶的理论,任何一个周期函数可以被分解为一系列振幅A,频率ωω或初相位θθ正弦函数的叠加

 

y=A1sin(ω1t+θ1)+A2sin(ω2t+θ2)+A3sin(ω3t+θ3)y=A1sin(ω1t+θ1)+A2sin(ω2t+θ2)+A3sin(ω3t+θ3)

  该信号在频域有三条竖线组成,而竖线图我们把它称为频谱图,大家可以通过下面的动画了解

  如图可知,通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每个正弦波对应频率的振幅是多少,而没有提到相位。基础的正弦波Asin(wt+θ)Asin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。

  我依稀记得高中学正弦函数的是时候,θθ的多少决定了正弦波向右移动多少。当然那个时候横坐标是相位角度,而时域信号的横坐标是时间,因此我们只需要将时间转换为相位角度就得到了初相位。相位差则是时间差在一个周期中所占的比例

 

θ=2πtTθ=2πtT

  所以傅里叶变换可以把一个比较复杂的函数转换为多个简单函数的叠加,将时域(即时间域)上的信号转变为频域(即频率域)上的信号,看问题的角度也从时间域转到了频率域,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理,这就可以大量减少处理信号计算量。信号经过傅里叶变换后,可以得到频域的幅度谱以及相位谱,信号的幅度谱和相位谱是信号傅里叶变换后频谱的两个属性。

傅里叶用途

  • 时域复杂的函数,在频域就是几条竖线
  • 求解微分方程,傅里叶变换则可以让微分和积分在频域中变为乘法和除法

傅里叶变换相关函数

  假设我们的输入信号的函数是

S=0.2+0.7∗cos(2π∗50t+20180π)+0.2∗cos(2π∗100t+70180π)S=0.2+0.7∗cos⁡(2π∗50t+20180π)+0.2∗cos⁡(2π∗100t+70180π)

可以发现直流分量是0.2,以及两个余弦函数的叠加,余弦函数的幅值分别为0.7和0.2,频率分别为50和100,初相位分别为20度和70度。

  1. freqs = np.fft.fftfreq(采样数量, 采样周期)--通过采样数与采样周期得到时域序列经过傅里叶变换后的频率序列
  2. np.fft.fft(原序列)--原函数值的序列经过快速傅里叶变换得到一个复数数组,复数的模代表的是振幅,复数的辐角代表初相位
  3. np.fft.ifft(复数序列)--复数数组 经过逆向傅里叶变换得到合成的函数值数组

案例:针对合成波做快速傅里叶变换,得到分解波数组的频率、振幅、初相位数组,并绘制频域图像。

python代码实现

import matplotlib.pyplot as plt 
import numpy as np
import numpy.fft as fft

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示符号

Fs = 1000;            # 采样频率
T = 1/Fs;             # 采样周期
L = 1000;             # 信号长度
t = [i*T for i in range(L)]
t = np.array(t)

S = 0.2+0.7*np.cos(2*np.pi*50*t+20/180*np.pi) + 0.2*np.cos(2*np.pi*100*t+70/180*np.pi) ;


complex_array = fft.fft(S)
print(complex_array.shape)  # (1000,) 
print(complex_array.dtype)  # complex128 
print(complex_array[1])  # (-2.360174309695419e-14+2.3825789764340993e-13j)

#################################
plt.subplot(311)
plt.grid(linestyle=':')
plt.plot(1000*t[1:51], S[1:51], label='S')  # y是1000个相加后的正弦序列
plt.xlabel("t(毫秒)")
plt.ylabel("S(t)幅值")
plt.title("叠加信号图")
plt.legend()

###################################
plt.subplot(312)
S_ifft = fft.ifft(complex_array)
# S_new是ifft变换后的序列
plt.plot(1000*t[1:51], S_ifft[1:51], label='S_ifft', color='orangered')
plt.xlabel("t(毫秒)")
plt.ylabel("S_ifft(t)幅值")
plt.title("ifft变换图")
plt.grid(linestyle=':')
plt.legend()

###################################
# 得到分解波的频率序列
freqs = fft.fftfreq(t.size, t[1] - t[0])
# 复数的模为信号的振幅(能量大小)
pows = np.abs(complex_array)

plt.subplot(313)
plt.title('FFT变换,频谱图')
plt.xlabel('Frequency 频率')
plt.ylabel('Power 功率')
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(freqs[freqs > 0], pows[freqs > 0], c='orangered', label='Frequency')
plt.legend()
plt.tight_layout()
plt.show()

python代码实现

MATLAB实现

clear
clc
close all
Fs = 1000;            % Sampling frequency
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector
S = 0.2-0.7*cos(2*pi*50*t+20/180*pi) + 0.2*cos(2*pi*100*t+70/180*pi) ;
plot(1000*t(1:50),S(1:50))
title('叠加信号图')
xlabel('t (milliseconds)')
ylabel('S(t)')

figure
Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
plot(f,P1,'linewidth',2)
title('FFT变换')
xlabel('频率(Hz)')
ylabel('幅值')

figure
pred_X=ifft(Y);
plot(1000*t(1:50),pred_X(1:50),'r-')

MATLAB实现

直流分量:就是傅里叶变换的第一个值,一般来说是非复数

幅值:2∗abs(Y各项采样长度)2∗abs(Y各项采样长度)

初相位:atan2(Y的虚部Y的实部)atan2(Y的虚部Y的实部)转角度制表示,rad2deg(atan2(imag(Y),real(Y)))

基于傅里叶变换的频域滤波

从某条曲线中除去一些特定的频率成份,这在工程上称为“滤波”。

含噪信号是高能信号与低能噪声叠加的信号,可以通过傅里叶变换的频域滤波实现降噪。

通过FFT使含噪信号转换为含噪频谱,去除低能噪声,留下高能频谱后再通过IFFT留下高能信号。

案例:基于傅里叶变换的频域滤波为音频文件去除噪声(noiseed.wav数据集地址)。

  1、读取音频文件,获取音频文件基本信息:采样个数,采样周期,与每个采样的声音信号值。绘制音频时域的:时间/位移图像

import numpy as np
import numpy.fft as nf
import scipy.io.wavfile as wf
import matplotlib.pyplot as plt

# 读取音频文件
sample_rate, noised_sigs = wf.read('./da_data/noised.wav')
print(sample_rate)  # sample_rate:采样率44100
print(noised_sigs.shape)    # noised_sigs:存储音频中每个采样点的采样位移(220500,)
times = np.arange(noised_sigs.size) / sample_rate

plt.figure('Filter')
plt.subplot(221)
plt.title('Time Domain', fontsize=16)
plt.ylabel('Signal', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(times[:178], noised_sigs[:178], c='orangered', label='Noised')
plt.legend()

 

 

  2、基于傅里叶变换,获取音频频域信息,绘制音频频域的:频率/能量图像

 

# 傅里叶变换后,绘制频域图像
freqs = nf.fftfreq(times.size, times[1] - times[0])
complex_array = nf.fft(noised_sigs)
pows = np.abs(complex_array)

plt.subplot(222)
plt.title('Frequency Domain', fontsize=16)
plt.ylabel('Power', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
# 指数增长坐标画图
plt.semilogy(freqs[freqs > 0], pows[freqs > 0], c='limegreen', label='Noised')
plt.legend()

 

  3、将低频噪声去除后绘制音频频域的:频率/能量图像

 

# 寻找能量最大的频率值
fund_freq = freqs[pows.argmax()]
# where函数寻找那些需要抹掉的复数的索引
noised_indices = np.where(freqs != fund_freq)
# 复制一个复数数组的副本,避免污染原始数据
filter_complex_array = complex_array.copy()
filter_complex_array[noised_indices] = 0
filter_pows = np.abs(filter_complex_array)

plt.subplot(224)
plt.xlabel('Frequency', fontsize=12)
plt.ylabel('Power', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(freqs[freqs >= 0], filter_pows[freqs >= 0], c='dodgerblue', label='Filter')
plt.legend()

 

  4、基于逆向傅里叶变换,生成新的音频信号,绘制音频时域的:时间/位移图像

 

filter_sigs = nf.ifft(filter_complex_array).real
plt.subplot(223)
plt.xlabel('Time', fontsize=12)
plt.ylabel('Signal', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(times[:178], filter_sigs[:178], c='hotpink', label='Filter')
plt.legend()

 

  5、重新生成音频文件

# 生成音频文件
wf.write('./da_data/filter.wav', sample_rate, filter_sigs)
plt.show()

离散傅里叶变换(DFT)

  离散傅里叶变换(DFT)对有限长时域离散信号的频谱进行等间隔采样,频域函数被离散化了,便于信号的计算机处理。DFT的运算量太大,FFT是离散傅里叶变换的快速算法。

  说白了FFT和DFT它俩就是一个东东,只不过复杂度不同,

  有时候我们能够看到N点傅里叶变换,我个人理解是这个N点是信号前面N个连续的数值,即N点FFT意思就是截取前面N个信号进行FFT,这样就要求我们的前N个采样点必须包含当前信号的一个周期,不然提取的余弦波参数与正确的叠加波的参数相差很大。

  如果在N点FFT的时候,如果这N个采样点不包含一个周期呢?或者说我们的信号压根不是一个周期函数咋办?或者有一段是噪音数据呢?如果用FFT计算,就会对整体结果影响很大,然后就有人想通过局部来逼近整体,跟微积分的思想很像,将信号分成一小段一小段,然后对每一小段做FFT,就跟分段函数似的,无数个分段函数能逼近任意的曲线((⊙o⊙)…应该没错吧),这样每一段都不会互相影响到了。

二、短时傅里叶变换stft

  在短时傅里叶变换过程中,窗的长度决定频谱图的时间分辨率和频率分辨率,窗长越长,截取的信号越长,信号越长,傅里叶变换后频率分辨率越高,时间分辨率越差;相反,窗长越短,截取的信号就越短,频率分辨率越差,时间分辨率越好,也就是说短时傅里叶变换中,时间分辨率和频率分辨率之间不能兼得,应该根据具体需求进行取舍。

计算短时傅里叶变换,需要指定的有:

  • 每个窗口的长度:nsc
  • 每相邻两个窗口的重叠率:nov
  • 每个窗口的FFT采样点数:nff

可以计算的有:

  • 海明窗:w=hamming(nsc, 'periodic')
  • 信号被分成了多少片
  • 短时傅里叶变换:

python库librosa实现

librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, 
        window='hann', center=True, pad_mode='reflect')

短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t)

  • 复数的实部:np.abs(D(f,t))频率的振幅
  • 复数的虚部:np.angle(D(f,t))频率的相位

参数:

  • y:音频时间序列
  • n_fft:FFT窗口大小,n_fft=hop_length+overlapping
  • hop_length:帧移,如果未指定,则默认win_length / 4。
  • win_length:每一帧音频都由window()加窗。窗长win_length,然后用零填充以匹配N_FFT。默认win_length=n_fft。
  • window:字符串,元组,数字,函数 shape =(n_fft, )
    • 窗口(字符串,元组或数字);
    • 窗函数,例如scipy.signal.hanning
    • 长度为n_fft的向量或数组
  • center:bool
    • 如果为True,则填充信号y,以使帧 D [:, t]以y [t * hop_length]为中心。
    • 如果为False,则D [:, t]从y [t * hop_length]开始
  • dtype:D的复数值类型。默认值为64-bit complex复数
  • pad_mode:如果center = True,则在信号的边缘使用填充模式。默认情况下,STFT使用reflection padding。

返回:

  • STFT矩阵D,shape =(1 + nfft2nfft2,t)
librosa.magphase(D, power=1)

将复值频谱D分离成其幅度(S)和相位(P)

参数:

  • D:复值谱图,np.ndarray [shape =(d,t),dtype = complex]
  • power:幅度谱图的指数,例如,1代表能量,2代表功率,等等。

返回:

  • D_mag :D的幅值,np.ndarray [shape =(d,t),dtype = real]
  • D_phase :D的相位,np.ndarray [shape =(d,t),dtype = complex],exp(1.j * phi)其中phi是D的相位

 

y, _ = librosa.load("p225_002.wav", sr=16000)

D = librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')
print(D.shape)    # (1025, 127)

# 将复值频谱D分离成其幅度(S)和相位(P)的部件
magnitude, phase = librosa.magphase(D, power=1)
# magnitude        # 赋值 [shape =(d,t),dtype = real] (1025, 127)
# phase.shape    # 相位 [shape =(d,t),dtype = complex] (1025, 127) 

angle = np.angle(phase)     # 获取相角(以弧度为单位)

tensorflow实现

一句话实现分帧、加窗、STFT变换

 

# [batch_size, signal_length].  batch_size and signal_length 可能会不知道
signals = tf.placeholder(tf.float32, [None, None])

# `stfts` 短时傅里叶变换:就是对信号中每一帧信号进行傅里叶变换 
# shape is [batch_size, ?, fft_unique_bins]
# 其中 fft_unique_bins = fft_length // 2 + 1 = 513.
stfts = tf.contrib.signal.stft(signals, frame_length=1024, frame_step=512,
                                                            fft_length=1024)

wlen:窗长

frame_length是信号中帧的长度

frame_step是帧移

fft_length:做fft变换的长度,或一种说话:fft变换所取得N点数,在有些地方也表示为NFFT。

注意:FFT的长度必须大于或者等于win的长度或者帧长。以获得更高的频域分辨率

FFT后的分辨率(频率的间隔)为fs/NFFT。当NFFT>wlen时就是在数据补零后做FFT,做的FFT得到的频谱等于以wlen长数据FFT的频谱中内插。

numpy库实现

上面的一行代码相当于下面一大段代码

def wav_to_frame(wave_data, win_len, win_shift):
    """
    进行分帧操作
    :param wave_data: 原始的数据
    :param win_len: 滑动窗长
    :param win_shift: 滑动间隔
    :return: 分帧之后的结果,输出一个帧矩阵
    """
    num_frames = (len(wave_data) - win_len) // win_shift + 1
    results = []
    for i in range(num_frames):
        results.append(wave_data[i*win_shift:i*win_shift + win_len])
    return np.array(results)

def spectrum_power(frames, NFFT):
    """
    计算每一帧傅立叶变换以后的功率谱
    参数说明:
    frames:audio2frame函数计算出来的帧矩阵
    NFFT:FFT的大小
    """
    # 功率谱等于每一点的幅度平方/NFFT
    return 1.0/NFFT * np.square(spectrum_magnitude(frames, NFFT))

def spectrum_magnitude(frames, NFFT):
    """计算每一帧经过FFT变幻以后的频谱的幅度,若frames的大小为N*L,则返回矩阵的大小为N*NFFT
    参数:
    frames:即audio2frame函数中的返回值矩阵,帧矩阵
    NFFT:FFT变换的数组大小,如果帧长度小于NFFT,则帧的其余部分用0填充铺满
    """
    complex_spectrum = np.fft.rfft(frames, NFFT)    # 对frames进行FFT变换
    # 返回频谱的幅度值
    return np.absolute(complex_spectrum)

 

三、frequency bin

在读paper的时候总是会遇到 frequency bin (频率窗口)这个词,

frequency bin 是指:raw data 经过FFT后得到的频谱图(频域率)中,频率轴的频率间隔或分辨率,通常取决采样率和采样点。

  

例子1:我们可以作用82MHz的采样频率,取得8200个数据记录,frequency bin=82000000/8200=10000=10kHz。

例子2:frequency bin是频率域中采样点之间的间隔。例如,如果采样率为100赫兹,FFT为100个点,frequency bin=1,则在[0 100)赫兹之间有100个点。因此,您将整个100赫兹范围划分为100个间隔,如0-1赫兹、1-2赫兹等。每一个如此小的间隔,比如0-1Hz,都是一个frequency bin(频率箱)。

参考

知乎Heinrich博主文章——傅里叶分析之掐死教程

【音频处理】离散傅里叶变换

【音频处理】短时傅里叶变换

分数傅里叶变换——FRFT 再将这部分内容之前看一个背景知识:对于任意的一个函数f(t)都可以表示为Hermite多项式的加权和,之所以可以这样表示是因为Hermite多项式构成类一组完备正交基。(对于任意一个函数必然可以被完备正交基进行表示)其中系数an表示为如下:类似于傅里叶当中系数的求解方式是一样的:得出的结论就是分数傅里叶算子和Hermit函数密切相关,而对于任意一个函数,可以有由Hermit多项式进行表示。如果被分数傅里叶算子作用在函数f(t)上,根据对应的形式能不能推导出积分核形式的定义。 阅读详情

相关推荐

【近万字】分数傅里叶变换课程学习笔记

学习自“课堂在线”平台,北京理工大学陶然教授的课程视频,讲解的非常详细全面,数学公式推导都有,以下为学习笔记,仅记录要点部分。 注:学习此课程,按重要程度排序,需要有信号与系统、数字信号处理、随机信号分析、矩阵论等课程的基础。 目录绪论分数傅里叶变换定义分数傅里叶变换的性质分数卷积与滤波卷积定理卷积的快速计算方法分数卷积功率谱分数功率谱分数域采样与重建分数域谱分析分数域采样后重建频域带通采样定理:分数域带通采样定理离散FRFT快速算法chirp信号检测与参数估计参数估计公式量纲归一化后记 绪论 傅里叶变换处

weixin_42845306的博客 1万+

快速傅里叶变换 python_快速傅里叶变换及python代码实现

一、前言我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我会通过前言普及一下相关知识。我们复习一下三角函数的标准式:$$y=A\cos (\omega x+\theta )+k$$$A$代表振幅,函数周期是$\frac{2\pi}{w}$,频率是周期的倒数$\...

weixin_39851008的博客 989

快速傅里叶变换及Python代码实现

我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我会通过前言普及一下相关知识。我们复习一下三角函数的标准式:A代表振幅,函数周期是2πw,频率是周期的倒数w2π,θ是函数初相位,k在信号处理中称为直流分量。这个信号在频域就是一条竖线。我们再来假设有一个比较复杂的时域函数y=f(t),根据傅里叶的理论,任何一个周期函数可以被分解为一系列振幅A,频率ω或初相位。

m0_72557783的博客 3169

快速傅里叶变换python_纯干货:FFT快速傅里叶变换的Python语言实现(源代码)

这两天一直在研究FFT算法,研究了两天总算整明白了快速傅里叶变换算法,今天就写一篇文章来总结一下。FFT和IFFT的Python语言实现源代码直接把我用了一个晚上写好的快速傅里叶变换和快速傅里叶逆变换的Python语言代码贴出,关键部分有注释,里面只用到了Python标准库cmath库,因为要计算cos、sin函数的值。直接复制到自己的Python程序中就可以直接使用了。"""@Author: S...

weixin_39706491的博客 824

用Python手把手教你实现FFT快速傅里叶变换(附完整代码)

本文详细介绍了如何使用Python从零实现FFT快速傅里叶变换,包括递归和迭代两种实现方式,并提供了完整的代码示例。通过音频频谱分析的实际案例,展示了FFT在数字信号处理中的高效应用,帮助开发者掌握这一核心算法及其优化技巧。

weixin_29094775的博客 471

FFT实战:5分钟用Python实现快速傅里叶变换(附完整代码)

本文详细介绍了如何使用Python在5分钟内实现快速傅里叶变换(FFT),并提供了完整代码示例。通过对比DFT与FFT的性能差异,展示了FFT在音频处理、图像压缩等领域的强大应用价值,帮助读者快速掌握这一关键的数字信号处理技术。

weixin_29094301的博客 193

快速傅里叶变换python_快速傅里叶变换及python代码实现

一、前言我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我会通过前言普及一下相关知识。我们复习一下三角函数的标准式:$$y=A\cos (\omega x+\theta )+k$$$A$代表振幅,函数周期是$\frac{2\pi}{w}$,频率是周期的倒数$\...

weixin_39866881的博客 715

python:傅里叶分析,快速傅里叶变换 FFT

使用python进行傅里叶分析,傅里叶变换 FFT

belldeep的专栏 5214

快速傅里叶变换(FFT)工程实践:从原理到Python代码实现

傅里叶变换是信号处理领域的核心数学工具,它通过将时域信号转换到频域,揭示信号中隐藏的频率成分。其基本原理是将复杂信号分解为不同频率正弦波的叠加,而快速傅里叶变换(FFT)算法将计算复杂度从O(N²)优化到O(N log N),极大提升了工程实用性。在技术价值上,FFT实现了高效的频谱分析,为信号特征提取、噪声过滤和模式识别提供了基础。应用场景广泛覆盖音频处理、通信系统、振动监测和金融数据分析等领域。本文聚焦于FFT的工程实践,通过Python的NumPy和SciPy库,详细讲解信号生成、FFT计算、结果可视

weixin_29050513的博客 229

AI小智语音服务架构与嵌入式成本优化实践

语音交互系统是智能硬件的核心能力,其本质是端云协同的实时数据处理链路,涵盖音频采集、流式传输、语义理解与语音合成四大技术环节。原理上需严格划分物理层(确定性音频I/O)、协议层(WebSocket/Range可靠性通信)和语义层(ASR/LLM/TTS职责解耦),以保障低延迟与高可用。技术价值在于通过VAD前置过滤、分块下载、Token截断等嵌入式级优化,显著降低云端调用成本与网络开销。典型应用场景包括儿童故事机、智能音箱、教育机器人等对响应速度、音色自然度和单次交互成本敏感的AI小智设备。本文聚焦火山引擎

weixin_30653091的博客 350

别再为数码管引脚发愁了!用STM32的普通IO口驱动TM1650数码管模块(附完整模拟I2C代码)

本文详细介绍了如何利用STM32的普通IO口通过模拟I2C协议驱动TM1650数码管模块,提供了完整的硬件连接方案和软件实现代码。通过模拟I2C技术,开发者可以灵活使用任意GPIO引脚控制多位数码管显示,解决了传统驱动方式占用大量IO资源的问题。文章包含TM1650寄存器解析、亮度控制等实用功能实现,并分享了常见问题排查与性能优化技巧。

weixin_30764771的博客 658

用python代码实现实验:应用快速傅里叶变换对信号进行频谱分析

2.下面的代码实现对于正弦信号的频谱分析。4.下面实现对于衰减正弦序列的频谱分析。3.下面代码实现高斯序列的频谱分析。5.下面实现三角序列的频谱分析。6.下面实现三角序列的频谱分析。如有不足,欢迎指正。

m0_67424508的博客 1249

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 474

理解快速傅里叶变换(FFT)算法

编注:这篇译文由@unblock 和@jingliang 共同完成。再次推荐:《如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】》   快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一。没有正规计算机科学课程背景的我,使用这个算法多年,但这周我却突然想起自己从没思考过为什么FFT能如此快速地计算离散傅里叶变换。我打开一本

洛阳如是 1237

大数据利器Hadoop:从基础到实战,一篇文章掌握大数据处理精髓!

在当今大数据时代,数据量的爆炸式增长对企业和技术提出了前所未有的挑战。如何高效地存储、处理和分析这些庞大的数据集,成为了亟待解决的问题。Hadoop作为一种分布式计算框架,应运而生,为大数据处理提供了有效的解决方案。Hadoop是一个由Apache软件基金会维护的开源项目,它基于Google的分布式文件系统(Google File System,GFS)和MapReduce计算模型设计。Hadoop的主要目标是处理大规模数据集,它可以在普通硬件集群上运行,从而降低了大数据处理的成本。

邓邓子的博客 8277

YOLOv13安装教程 手把手教你融合空间注意力机制(SAB)的RAB卷积模块 自动“聚焦”重要的特征 map指标提升8.96,准确率提升3.56

本文提出了一种改进的YOLOv13目标检测模型,通过引入RAB(残差注意力模块)显著提升了检测性能。实验结果显示,添加RAB模块后,mAP指标提升了8.96,准确率提高了3.56%。文章详细介绍了RAB模块的实现方法:1)采用多级残差连接增强特征提取能力;2)结合空间注意力机制(SAB)自动聚焦关键区域;3)通过1×1卷积实现通道维度压缩与恢复。同时提供了完整的模型移植方案,包括配置文件修改、任务处理代码调整以及模块实现细节,为YOLO系列模型的性能优化提供了有效参考。

FJN110的博客 646

数值计算 利用Python实现快速傅里叶变换(FFT)(不调用函数库)

数值计算-利用Python实现快速傅里叶变换(FFT)(不调用函数库) 快速傅里叶变换介绍 首先介绍离散傅里叶变换(DFT),不管是正变换还是逆变换,计算公式可以归结为 X(k)=∑n=0N−1x(n)WNnk X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk} X(k)=n=0∑N−1​x(n)WNnk​ 其中,NNN为抽样点的个数(一般为2n2^n2n), x(n)x(n)x(n)为已知数据(拟合函数时为节点函数值), WN=e−i2πnW_N=e^{-i\frac{2\pi}{n}}W

patchouli233的博客 3608

某头部金融APP防护机制逆向实录:从反调试到TEE加密的全链路攻防拆解

金融APP安全防护体系深度破解分析 本文详细拆解了某头部金融APP的三重防御机制破解过程。首先通过Frida绕过反调试技术,包括ptrace自我绑定、TracerPid检测和debuggerd监控;随后针对12种Root检测方法(如su文件检查、Magisk检测等)进行环境伪装,通过Hook系统调用伪造安全环境;最后逆向分析TEE加密模块,解密关键接口参数。整个破解过程涉及静态分析、动态调试和代码注入技术,揭示了金融级APP安全防护的实现原理与突破方法(注:所有操作均获授权,仅用于安全研究)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1399

OPENCV学习笔记-利用快速傅里叶变换实现高通滤波

OPENCV学习笔记-利用快速傅里叶变换实现高通滤波代码代码逻辑结果 代码 (跟着官方教程敲的↓) https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_transforms/py_fourier_transform/py_fourier_transform.html#fourier-t...

qq_20474257的博客 1919

【100%通过率】华为OD机试真题 Python 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

基于python的快速傅里叶变换FFT(二)

基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换。 知识点  FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号...

weixin_30296405的博客 193

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

快速傅里叶变换

快速傅里叶变化(FFT)是离散傅里叶变化(DFT)的快速算法。一个长度为N的有限长序列的DFT为 式中的 为 。离散傅里叶反变换为 FFT算法的基本思想是利用 的对称性和周期性,即 =- 和 (r为任意整数),通过将长序列分解为短序列,再由短序列的DFT组合来实现整个长序列的DFT,从而减少DFT的复数乘法和复数加法次数,提高DFT的运算速度和效率。将N点的长序列分解为短序列可以有多种

jirryzhang的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 修改Linux主机名和IP
下一篇: Python:Sklearn概述
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值