csdn官网/秦洁婷seo博客
2.20 傅里叶变换:从时域到频域的算法实现
目录
2.20.1 FFT算法原理
傅里叶变换(Fourier Transform,FT)是一种将时域信号转换为频域信号的数学工具,而快速傅里叶变换(Fast Fourier Transform,FFT)则是实现傅里叶变换的一种高效算法。FFT 算法通过递归分治的方法,将一个大问题分解为多个小问题,从而显著减少计算复杂度。
- 傅里叶变换的基本概念:时域信号和频域信号的概念。
- FFT算法的数学原理:详细解释 FFT 算法的数学公式和步骤。
- FFT算法的实现:如何使用 NumPy 实现 FFT 算法。
graph LRA[FFT算法原理] --> B[基本概念]B --> C[时域信号]B --> D[频域信号]A --> E[数学原理]E --> F[离散傅里叶变换 (DFT)]E --> G[快速傅里叶变换 (FFT)]A --> H[实现]H --> I[使用 NumPy]H --> J[示例代码]
2.20.1.1 傅里叶变换的基本概念
傅里叶变换可以将一个在时间域内表示的信号转换为在频率域内表示的信号。
2.20.1.1.1 时域信号
时域信号是随时间变化的信号,通常表示为 ( x(t) )。
import numpy as np
import matplotlib.pyplot as plt# 生成时域信号
t = np.linspace(0, 1, 1000, endpoint=False) # 时间轴
x = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 10 * t) # 两个正弦波的叠加# 绘制时域信号
plt.plot(t, x)
plt.xlabel('时间 (s)')
plt.ylabel('振幅')
plt.title('时域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.1.1.2 频域信号
频域信号是通过傅里叶变换得到的信号,通常表示为 ( X(f) )。
# 计算频域信号
X = np.fft.fft(x) # 使用 NumPy 进行快速傅里叶变换
freqs = np.fft.fftfreq(t.shape[-1], d=t[1] - t[0]) # 计算频率轴# 绘制频域信号
plt.plot(freqs, np.abs(X))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.1.2 FFT算法的数学原理
离散傅里叶变换(Discrete Fourier Transform,DFT)的公式如下:
[ X[k] = \sum_{n=0}^{N-1} x[n] e^{-j 2 \pi k n / N} ]
其中,( N ) 是信号的长度,( x[n] ) 是时域信号,( X[k] ) 是频域信号。
快速傅里叶变换(FFT)通过递归分治的方法,将 DFT 的计算复杂度从 ( O(N^2) ) 降低到 ( O(N \log N) )。
2.20.1.2.1 离散傅里叶变换 (DFT)
# 手动实现 DFT
def dft(x):N = len(x)X = np.zeros(N, dtype=np.complex128)for k in range(N):for n in range(N):X[k] += x[n] * np.exp(-2j * np.pi * k * n / N) # 计算 DFTreturn X# 计算 DFT
X_dft = dft(x)
freqs_dft = np.fft.fftfreq(t.shape[-1], d=t[1] - t[0])# 绘制 DFT 结果
plt.plot(freqs_dft, np.abs(X_dft))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('离散傅里叶变换 (DFT)')
plt.grid(True)
plt.show() # 显示图表
2.20.1.2.2 快速傅里叶变换 (FFT)
# 使用 NumPy 的 fft 函数实现 FFT
X_fft = np.fft.fft(x)
freqs_fft = np.fft.fftfreq(t.shape[-1], d=t[1] - t[0])# 绘制 FFT 结果
plt.plot(freqs_fft, np.abs(X_fft))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('快速傅里叶变换 (FFT)')
plt.grid(True)
plt.show() # 显示图表
2.20.1.3 FFT算法的实现
使用 NumPy 的 fft
模块可以轻松实现 FFT 算法。
# 计算 FFT
X_fft = np.fft.fft(x)
freqs_fft = np.fft.fftfreq(t.shape[-1], d=t[1] - t[0])# 绘制 FFT 结果
plt.plot(freqs_fft, np.abs(X_fft))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('快速傅里叶变换 (FFT)')
plt.grid(True)
plt.show() # 显示图表
2.20.2 复数数组存储优化
复数数组在存储和计算中占据一定的空间和时间。通过合理的存储优化,可以提高性能。
- 复数数组的存储方式:NumPy 中复数数组的存储方式。
- 存储优化技巧:如何优化复数数组的存储。
2.20.2.1 复数数组的存储方式
NumPy 中的复数数组通常使用 np.complex128
或 np.complex64
类型。
# 创建复数数组
complex_data = np.array([1 + 2j, 3 + 4j, 5 + 6j], dtype=np.complex128)# 查看复数数组的类型和内存占用
print(f"复数数组类型: {complex_data.dtype}")
print(f"复数数组内存占用: {complex_data.nbytes} 字节")
2.20.2.2 存储优化技巧
可以通过选择不同的数据类型和使用内存映射来优化复数数组的存储。
2.20.2.2.1 使用 float64
# 使用 float64 存储复数数组
real_part = np.array([1, 3, 5], dtype=np.float64)
imag_part = np.array([2, 4, 6], dtype=np.float64)
complex_data_optimized = real_part + 1j * imag_part# 查看优化后的复数数组的类型和内存占用
print(f"优化后的复数数组类型: {complex_data_optimized.dtype}")
print(f"优化后的复数数组内存占用: {complex_data_optimized.nbytes} 字节")
2.20.2.2.2 使用 float32
# 使用 float32 存储复数数组
real_part = np.array([1, 3, 5], dtype=np.float32)
imag_part = np.array([2, 4, 6], dtype=np.float32)
complex_data_optimized = real_part + 1j * imag_part# 查看优化后的复数数组的类型和内存占用
print(f"优化后的复数数组类型: {complex_data_optimized.dtype}")
print(f"优化后的复数数组内存占用: {complex_data_optimized.nbytes} 字节")
2.20.2.2.3 内存映射
对于大规模数据,可以使用内存映射来优化存储和计算性能。
# 创建内存映射文件
filename = 'complex_data_mmap.npy'
size = 10000000 # 大规模数据
complex_data_mmap = np.memmap(filename, dtype=np.complex128, mode='w+', shape=(size,))# 填充示例数据
np.random.seed(42)
complex_data_mmap[:] = np.random.rand(size) + 1j * np.random.rand(size)# 读取内存映射数据
complex_data_read = np.memmap(filename, dtype=np.complex128, mode='r', shape=(size,))# 查看内存占用
print(f"内存映射数据内存占用: {complex_data_read.nbytes / (1024 * 1024):.2f} MB")
2.20.3 频域滤波案例
频域滤波是一种常见的信号处理技术,通过在频域中操作信号来去除噪声或提取有用信息。
- 频域滤波的基本原理:如何在频域中去除噪声。
- 低通滤波器实现:如何实现一个低通滤波器。
- 高通滤波器实现:如何实现一个高通滤波器。
2.20.3.1 频域滤波的基本原理
频域滤波的基本原理是在频域中对信号进行操作,去除不需要的频率成分。
2.20.3.1.1 去除噪声
# 生成带有噪声的时域信号
t = np.linspace(0, 1, 1000, endpoint=False) # 时间轴
x = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(t.shape[0]) # 添加噪声# 计算 FFT
X = np.fft.fft(x)
freqs = np.fft.fftfreq(t.shape[-1], d=t[1] - t[0])# 绘制带噪声的时域信号
plt.plot(t, x)
plt.xlabel('时间 (s)')
plt.ylabel('振幅')
plt.title('带有噪声的时域信号')
plt.grid(True)
plt.show() # 显示图表# 绘制带噪声的频域信号
plt.plot(freqs, np.abs(X))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('带有噪声的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.3.1.2 保留有用信息
通过去除高频噪声,可以保留有用的信息。
# 设计低通滤波器
def low_pass_filter(X, freqs, cutoff):X_filtered = X.copy()X_filtered[np.abs(freqs) > cutoff] = 0 # 高于截止频率的频率成分设为 0return X_filtered# 应用低通滤波器
cutoff = 15 # 截止频率
X_filtered = low_pass_filter(X, freqs, cutoff)# 计算逆 FFT
x_filtered = np.fft.ifft(X_filtered)# 绘制去噪后的时域信号
plt.plot(t, np.real(x_filtered))
plt.xlabel('时间 (s)')
plt.ylabel('振幅')
plt.title('去噪后的时域信号')
plt.grid(True)
plt.show() # 显示图表# 绘制去噪后的频域信号
plt.plot(freqs, np.abs(X_filtered))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('去噪后的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.3.2 低通滤波器实现
低通滤波器可以去除高频噪声,保留低频信号。
2.20.3.2.1 设计滤波器
# 设计低通滤波器
def low_pass_filter(X, freqs, cutoff):X_filtered = X.copy()X_filtered[np.abs(freqs) > cutoff] = 0 # 高于截止频率的频率成分设为 0return X_filtered
2.20.3.3.2 应用滤波器
高通滤波器可以去除低频噪声,保留高频信号。
2.20.3.3.1 设计滤波器
# 设计高通滤波器
def high_pass_filter(X, freqs, cutoff):X_filtered = X.copy()X_filtered[np.abs(freqs) < cutoff] = 0 # 低于截止频率的频率成分设为 0return X_filtered
2.20.3.3.2 应用滤波器
# 应用高通滤波器
cutoff = 15 # 截止频率
X_filtered = high_pass_filter(X, freqs, cutoff)# 计算逆 FFT
x_filtered = np.fft.ifft(X_filtered)# 绘制去噪后的时域信号
plt.plot(t, np.real(x_filtered))
plt.xlabel('时间 (s)')
plt.ylabel('振幅')
plt.title('去噪后的时域信号')
plt.grid(True)
plt.show() # 显示图表# 绘制去噪后的频域信号
plt.plot(freqs, np.abs(X_filtered))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('去噪后的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4 音频处理案例
音频信号的处理是傅里叶变换的一个重要应用领域。通过频域处理,可以实现音频去噪、音频压缩等操作。
- 音频信号的基本处理:如何读取和写入音频文件。
- 音频去噪:如何使用 FFT 在频域中去除音频中的噪声。
- 音频压缩:如何使用 FFT 实现音频的简单压缩。
2.20.4.1 音频信号的基本处理
2.20.4.1.1 读取音频文件
from scipy.io import wavfile# 读取音频文件
sample_rate, audio_data = wavfile.read('noisy_audio.wav')# 绘制音频信号
plt.plot(audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('读取的音频信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.1.2 写入音频文件
# 写入音频文件
wavfile.write('filtered_audio.wav', sample_rate, np.real(x_filtered).astype(np.int16))# 读取并绘制去噪后的音频信号
sample_rate, filtered_audio_data = wavfile.read('filtered_audio.wav')
plt.plot(filtered_audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('去噪后的音频信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.2 音频去噪
2.20.4.2.1 读取带有噪声的音频文件
# 读取带有噪声的音频文件
sample_rate, noisy_audio_data = wavfile.read('noisy_audio.wav')# 绘制带有噪声的音频信号
plt.plot(noisy_audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('带有噪声的音频信号')
plt.grid(True)
plt.show() # 显示图表# 计算 FFT
X_audio = np.fft.fft(noisy_audio_data)
freqs_audio = np.fft.fftfreq(noisy_audio_data.shape[0], d=1.0 / sample_rate)# 绘制带有噪声的频域信号
plt.plot(freqs_audio, np.abs(X_audio))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('带有噪声的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.2.2 应用低通滤波器
# 应用低通滤波器
cutoff_audio = 1000 # 截止频率
X_audio_filtered = low_pass_filter(X_audio, freqs_audio, cutoff_audio)# 计算逆 FFT
filtered_audio_data = np.fft.ifft(X_audio_filtered)# 绘制去噪后的音频信号
plt.plot(np.real(filtered_audio_data))
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('去噪后的音频信号')
plt.grid(True)
plt.show() # 显示图表# 绘制去噪后的频域信号
plt.plot(freqs_audio, np.abs(X_audio_filtered))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('去噪后的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.2.3 写入去噪后的音频文件
# 写入去噪后的音频文件
wavfile.write('filtered_audio.wav', sample_rate, np.real(filtered_audio_data).astype(np.int16))# 读取并绘制去噪后的音频信号
sample_rate, filtered_audio_data = wavfile.read('filtered_audio.wav')
plt.plot(filtered_audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('去噪后的音频信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.3 音频压缩
2.20.4.3.1 读取音频文件
# 读取音频文件
sample_rate, audio_data = wavfile.read('original_audio.wav')# 绘制原始音频信号
plt.plot(audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('原始音频信号')
plt.grid(True)
plt.show() # 显示图表# 计算 FFT
X_audio = np.fft.fft(audio_data)
freqs_audio = np.fft.fftfreq(audio_data.shape[0], d=1.0 / sample_rate)# 绘制原始频域信号
plt.plot(freqs_audio, np.abs(X_audio))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('原始频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.3.2 应用频域压缩
# 应用频域压缩
def compress_audio(X, freqs, compression_ratio):N = X.shape[0]cutoff = int(N * compression_ratio)X_compressed = X.copy()X_compressed[cutoff:-cutoff] = 0 # 将中间部分频率成分设为 0return X_compressed# 压缩比例
compression_ratio = 0.3 # 保留 30% 的频率成分# 应用频域压缩
X_audio_compressed = compress_audio(X_audio, freqs_audio, compression_ratio)# 计算逆 FFT
compressed_audio_data = np.fft.ifft(X_audio_compressed)# 绘制压缩后的音频信号
plt.plot(np.real(compressed_audio_data))
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('压缩后的音频信号')
plt.grid(True)
plt.show() # 显示图表# 绘制压缩后的频域信号
plt.plot(freqs_audio, np.abs(X_audio_compressed))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('压缩后的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.4.3.3 写入压缩后的音频文件
# 写入压缩后的音频文件
wavfile.write('compressed_audio.wav', sample_rate, np.real(compressed_audio_data).astype(np.int16))# 读取并绘制压缩后的音频信号
sample_rate, compressed_audio_data = wavfile.read('compressed_audio.wav')
plt.plot(compressed_audio_data)
plt.xlabel('样本点')
plt.ylabel('振幅')
plt.title('压缩后的音频信号')
plt.grid(True)
plt.show() # 显示图表
2.20.5 与 CUFFT 性能对比
CUFFT 是 NVIDIA 提供的用于 GPU 加速的 FFT 库。通过与 NumPy 的 FFT 性能对比,可以了解在不同场景下的适用性。
- CUFFT 的基本原理:CUFFT 的工作原理和使用方法。
- 性能测试:在不同规模的数据上进行性能测试。
- 结论:对比结果和适用场景。
2.20.5.1 CUFFT 的基本原理
CUFFT 通过在 GPU 上并行计算 FFT,可以显著提高计算速度。
2.20.5.1.1 工作原理
CUFFT 利用 GPU 的并行计算能力,将 FFT 计算任务分解为多个并行子任务,从而实现高性能计算。
2.20.5.1.2 使用方法
import pycuda.autoinit
import pycuda.driver as cuda
import numpy as np
import cufft# 创建数据并传输到 GPU
size = 10000000
x_gpu = cuda.to_device(np.random.rand(size).astype(np.float32))# 创建 CUFFT 计划
plan = cufft.Plan1d(size, cufft.CUFFT_R2C, 1)# 执行 CUFFT
X_gpu = cuda.empty_like(x_gpu, dtype=np.complex64)
plan.forward(x_gpu, X_gpu)# 从 GPU 传输回 CPU
X_cpu = X_gpu.get()# 计算频域信号
freqs = np.fft.fftfreq(size, d=1.0 / 1000) # 假设采样率为 1000 Hz# 绘制频域信号
plt.plot(freqs, np.abs(X_cpu))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('CUFFT 计算的频域信号')
plt.grid(True)
plt.show() # 显示图表
2.20.5.2 性能测试
2.20.5.2.1 不同规模数据
sizes = [1000, 10000, 100000, 1000000, 10000000] # 不同数据规模
numpy_times = []
cufft_times = []for size in sizes:# 生成测试数据x = np.random.rand(size).astype(np.float32)x_gpu = cuda.to_device(x)# 创建 CUFFT 计划plan = cufft.Plan1d(size, cufft.CUFFT_R2C, 1)# NumPy FFT 性能测试import timestart = time.time()X_numpy = np.fft.fft(x)end = time.time()numpy_times.append(end - start)# CUFFT 性能测试start = time.time()X_gpu = cuda.empty_like(x_gpu, dtype=np.complex64)plan.forward(x_gpu, X_gpu)end = time.time()cufft_times.append(end - start)
2.20.5.2.2 测试代码
import pycuda.autoinit
import pycuda.driver as cuda
import numpy as np
import cufft
import timesizes = [1000, 10000, 100000, 1000000, 10000000] # 不同数据规模
numpy_times = []
cufft_times = []for size in sizes:# 生成测试数据x = np.random.rand(size).astype(np.float32)x_gpu = cuda.to_device(x)# 创建 CUFFT 计划plan = cufft.Plan1d(size, cufft.CUFFT_R2C, 1)# NumPy FFT 性能测试start = time.time()X_numpy = np.fft.fft(x)end = time.time()numpy_times.append(end - start)# CUFFT 性能测试start = time.time()X_gpu = cuda.empty_like(x_gpu, dtype=np.complex64)plan.forward(x_gpu, X_gpu)end = time.time()cufft_times.append(end - start)# 绘制性能对比图
plt.plot(sizes, numpy_times, label='NumPy FFT')
plt.plot(sizes, cufft_times, label='CUFFT')
plt.xlabel('数据规模')
plt.ylabel('计算时间 (s)')
plt.title('NumPy FFT 与 CUFFT 性能对比')
plt.legend()
plt.grid(True)
plt.show() # 显示图表
2.20.5.2.3 测试结果
通过性能测试,可以看到在大规模数据上,CUFFT 的性能显著优于 NumPy FFT。
2.20.5.3 结论
- 对比结果:在小规模数据上,NumPy FFT 和 CUFFT 的性能差异不大;但在大规模数据上,CUFFT 的性能显著优于 NumPy FFT。
- 适用场景:对于大规模数据处理,推荐使用 CUFFT;对于小规模数据处理,NumPy FFT 足够使用且更简单易用。
2.20.6 总结
本文详细介绍了傅里叶变换(FFT)的原理、复数数组的存储优化、频域滤波案例以及音频处理案例,并通过性能测试对比了 NumPy FFT 和 CUFFT 的性能。希望这些内容能帮助你在信号处理和音频处理中更好地应用傅里叶变换。
2.20.7 参考文献
参考资料名称 | 链接 |
---|---|
NumPy 官方文档 | NumPy Documentation |
SciPy 官方文档 | SciPy Documentation |
CUFFT 官方文档 | CUFFT Documentation |
Python 数据科学手册 | Python Data Science Handbook |
傅里叶变换原理 | Fourier Transform |
高效傅里叶变换实现 | Efficient Fourier Transform Implementation |
信号处理基础 | Signal Processing Basics |
音频处理指南 | Audio Processing Guide |
傅里叶变换在音频处理中的应用 | Fourier Transform in Audio Processing |
高频滤波器设计 | High-pass Filter Design |
低频滤波器设计 | Low-pass Filter Design |
音频压缩技术 | Audio Compression Techniques |
傅里叶变换与卷积 | Fourier Transform and Convolution |
傅里叶变换在图像处理中的应用 | Fourier Transform in Image Processing |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.20 傅里叶变换:从时域到频域的算法实现
2.20 傅里叶变换:从时域到频域的算法实现 目录 #mermaid-svg-zrRqIme9IEqP6JJE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zrRqIme9IEqP6JJE .error-icon{fill:#552222;}#mermaid-svg-zrRqIme9IEqP…...
PAT甲级1052、Linked LIst Sorting
题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…...

git error: invalid path
git clone GitHub - guanpengchn/awesome-books: :books: 开发者推荐阅读的书籍 在windows上想把这个仓库拉取下来,发现本地git仓库创建 但只有一个.git隐藏文件夹,其他文件都处于删除状态。 问题: Cloning into awesome-books... remote:…...

优选算法合集————双指针(专题二)
好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...

Ubuntu下Tkinter绑定数字小键盘上的回车键(PySide6类似)
设计了一个tkinter程序,在Win下绑定回车键,直接绑定"<Return>"就可以使用主键盘和小键盘的回车键直接“提交”,到了ubuntu下就不行了。经过搜索,发现ubuntu下主键盘和数字小键盘的回车键,名称不一样。…...

使用arcpy列表函数
本节将以ListFeatureClasses()为例,学习如何使用arcpy中的列表函数. 操作方法: 1.打开IDLE,新建脚本窗口 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "<>" 4.调用ListFeatureClasses()函数,并将返回的值赋值给fcList变量 fcList arcpy.ListFe…...

基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要
前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…...

【PyQt】pyqt小案例实现简易文本编辑器
pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器,使用PyQt5框架构建。以下是代码的主要功能和特点: 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...

二叉树03(数据结构初阶)
文章目录 一:实现链式结构二叉树1.1前中后序遍历1.1.1遍历规则1.1.2代码实现 1.2结点个数以及高度等1.2.1二叉树结点个数1.2.2二叉树叶子结点个数1.2.3二叉树第k层结点个数1.2.4二叉树的深度/高度1.2.5 二叉树查找值为x的结点1.2.6二叉树的销毁 1.3层序遍历1.4判断是…...

ComfyUI工作流 图像反推生成人像手办人像参考(SDXL版)
文章目录 图像反推生成人像手办人像参考SD模型Node节点工作流程效果展示开发与应用图像反推生成人像手办人像参考 本工作流旨在通过利用 Stable Diffusion XL(SDXL)模型和相关辅助节点,实现高效的人像参考生成和手办设计。用户可通过加载定制的模型、LORA 调整和控制节点对…...

【01】共识机制
BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…...

sentinel的限流原理
Sentinel 的限流原理基于 流量统计 和 流量控制策略,通过动态规则对系统资源进行保护。其核心设计包括以下几个关键点: 流量统计模型:滑动时间窗口 Sentinel 使用 滑动时间窗口算法 统计单位时间内的请求量,相比传统的固定时间窗…...

ZOJ 1007 Numerical Summation of a Series
原题目链接 生成该系列值的表格 对于x 的 2001 个值,x 0.000、0.001、0.002、…、2.000。表中的所有条目的绝对误差必须小于 0.5e-12(精度为 12 位)。此问题基于 Hamming (1962) 的一个问题,当时的大型机按今天的微型计算机标准来…...

『 C 』 `##` 在 C 语言宏定义中的作用解析
文章目录 ## 运算符的基本概念可变参数宏与 ## 的应用可变参数宏简介## 处理可变参数的两种情况可变参数列表为空可变参数列表不为空 示例代码验证 在 C 和 C 编程里,宏定义是个很有用的工具。今天咱们就来聊聊 ## 这个预处理器连接运算符在宏定义中的作用ÿ…...

独立成分分析 (ICA):用于信号分离或降维
人工智能例子汇总:AI常见的算法和例子-CSDN博客 独立成分分析 (Independent Component Analysis, ICA) 是一种用于信号分离和降维的统计方法,常用于盲源分离 (Blind Source Separation, BSS) 问题,例如音频信号分离或脑电信号 (EEG) 处理。…...

为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如: [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意࿰…...

实际操作 检测缺陷刀片
号he 找到目标图像的缺陷位置,首先思路为对图像进行预处理,灰度-二值化-针对图像进行轮廓分析 //定义结构元素 Mat se getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); morphologyEx(thre, tc, MORPH_OPEN, se, Point(-1, -1), 1); …...

使用Pygame制作“青蛙过河”游戏
本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…...

BUU17 [RoarCTF 2019]Easy Calc1
自用 源代码 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…...

堆的实现——对的应用(堆排序)
文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候,需要有二叉树的基础知识,大家可以看我的二叉树文章:二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …,kn−1 } ,把它的所有元素按完全⼆叉树…...

新生讲课——图和并查集
1.图的存储 (1).邻接矩阵 邻接矩阵可以借助stl中的vector,我们通过开一个二维矩阵,g[u]中存储的是u可以到达的点,定义如下 const int N 2e5 10; vector<int> g[N] 若是遇到带权图则定义如下 const int N 2e5 10; vector <pair <int ,…...

基于深度学习的视觉检测小项目(十七) 用户管理后台的编程
完成了用户管理功能的阶段。下一阶段进入AI功能相关。所有的资源见文章链接。 补充完后台代码的用户管理界面代码: import sqlite3from PySide6.QtCore import Slot from PySide6.QtWidgets import QDialog, QMessageBoxfrom . import user_manage # 导入使用ui…...

实战:利用百度站长平台加速网站收录
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/33.html 利用百度站长平台加速网站收录是一个实战性很强的过程,以下是一些具体的步骤和策略: 一、了解百度站长平台 百度站长平台是百度为网站管理员提供的一系列工…...

web-XSS-CTFHub
前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…...

【C++】P1957 口算练习题
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式: 💯我的做法代码实现: 💯老师的做法代码实现: 💯对比分析&am…...

第二十三章 MySQL锁之表锁
目录 一、概述 二、语法 三、特点 一、概述 表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类: 1. 表锁 2. 元数…...

linux 进程补充
环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功&#…...

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章
目录 说明 通常分为两种类型: 本地文件包含 典型的攻击方式1: 影响: 典型的攻击方式2: 包含路径解释: 日志包含漏洞: 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…...

Java 大视界 -- Java 大数据在智能医疗影像诊断中的应用(72)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…...

Web - CSS3浮动定位与背景样式
概述 这篇文章主要介绍了 CSS3 中的浮动定位、背景样式、变形效果等内容。包括 BFC 规范与创建方法、浮动的功能与使用要点、定位的多种方式及特点、边框与圆角的设置、背景的颜色、图片等属性、多种变形效果及 3D 旋转等,还提到了浏览器私有前缀。 BFC规范与浏览…...