音频数据增强:提升音频信号质量的多种技术

news2025/1/11 7:53:19

  在音频处理和机器学习领域,音频数据增强是一种常用的技术,旨在通过对原始音频信号进行各种变换和处理,生成更多样化的训练数据。
  这不仅可以提高模型的鲁棒性,还能改善其在真实世界应用中的表现。本文将介绍几种常用的音频数据增强技术,包括时间拉伸、音高变换、带通滤波、均衡器、冲激响应处理、添加回声与延迟、非线性模拟等。

1. 时间拉伸

  时间拉伸是一种改变音频信号播放速度而不改变其音高的技术。通过随机选择一个拉伸因子(例如在 0.8 到 1.2 之间),我们可以使音频信号变得更快或更慢。这种处理可以帮助模型适应不同的说话速度或音乐节奏。

import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
def time_stretch(audio_data):
    """时间拉伸音频信号"""
    stretch_factor = 1.5
    stretched_audio = librosa.effects.time_stretch(audio_data, rate=stretch_factor)
    return stretched_audio
def plot_signals_and_spectra(original_audio, enhanced_audio, sr):
    """绘制原始音频和增强音频的信号及频谱"""
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(enhanced_audio, sr=sr, alpha=0.5)
    plt.title('Stretched Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 4)
    D_enhanced = librosa.amplitude_to_db(np.abs(librosa.stft(enhanced_audio)), ref=np.max)
    librosa.display.specshow(D_enhanced, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Stretched Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    stretched_audio = time_stretch(original_audio)
    plot_signals_and_spectra(original_audio, stretched_audio, sr)

在这里插入图片描述

2. 音高变换

  音高变换是指在不改变音频信号播放速度的情况下,调整其音高。通过随机选择音高变换的步数(例如 -2、-1、1、2),我们可以模拟不同的音调变化。这对于音乐和语音信号的处理尤为重要。

import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
def pitch_shift(audio_data, sr):
    selected_pitch = 6
    shifted_audio = librosa.effects.pitch_shift(audio_data, sr=sr, n_steps=selected_pitch)
    return shifted_audio
def plot_signals_and_spectra(original_audio, enhanced_audio, sr):
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(enhanced_audio, sr=sr, alpha=0.5)
    plt.title('Pitch Shifted Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 4)
    D_enhanced = librosa.amplitude_to_db(np.abs(librosa.stft(enhanced_audio)), ref=np.max)
    librosa.display.specshow(D_enhanced, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Pitch Shifted Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    shifted_audio = pitch_shift(original_audio, sr)
    plot_signals_and_spectra(original_audio, shifted_audio, sr)

在这里插入图片描述

3. 带通滤波

  带通滤波是一种常用的信号处理技术,用于保留特定频率范围内的信号,同时抑制其他频率。通过随机选择低频和高频截止频率,我们可以模拟不同的环境和设备特性。

import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
import random
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    normal_lowcut = lowcut / nyq
    normal_highcut = highcut / nyq
    b, a = butter(order, [normal_lowcut, normal_highcut], btype='band', analog=False)
    return b, a
def bandpass_filter_audio(audio_data, sr, lowcut, highcut):
    b, a = butter_bandpass(lowcut, highcut, sr)
    filtered_audio = lfilter(b, a, audio_data)
    return filtered_audio
def plot_signals_and_spectra(original_audio, filtered_audio, sr):
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(filtered_audio, sr=sr, alpha=0.5)
    plt.title('Filtered Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')

    plt.subplot(2, 2, 4)
    D_filtered = librosa.amplitude_to_db(np.abs(librosa.stft(filtered_audio)), ref=np.max)
    librosa.display.specshow(D_filtered, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Filtered Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    filtered_audio = bandpass_filter_audio(original_audio, sr, lowcut=300, highcut=4000)
    plot_signals_and_spectra(original_audio, filtered_audio, sr)

在这里插入图片描述

4. 均衡器

  均衡器用于调整音频信号中不同频段的增益。通过定义多个频段及其增益,我们可以增强或削弱特定频率范围的音频信号,从而改善音质。
  定义了多个频段,每个频段都有一个低截止频率(lowcut)、高截止频率(highcut)和增益(gain)。
  频段的划分应确保下界(lowcut)不太靠近 20 Hz,上界(highcut)不太靠近采样频率的一半(fs/2),以避免滤波器设计中的不稳定性。

import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
from scipy.signal import butter, lfilter
import random
def butter_bandpass(lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    if lowcut <= 0 or highcut >= nyq:
        raise ValueError("Lowcut and highcut must be in the range (0, Nyquist frequency).")
    normal_lowcut = lowcut / nyq
    normal_highcut = highcut / nyq
    b, a = butter(order, [normal_lowcut, normal_highcut], btype='band', analog=False)
    return b, a
def equalizer(audio_data, sr):
    bands = [
        (60, 200, 0.8),
        (200, 500, 1.5),
        (500, 1000, 1.2),
        (1000, 2000, 1),
        (2000, 4000, 1.5),
        (4000, 7995, 0.5)
    ]
    output = np.zeros_like(audio_data)
    if np.any(np.isnan(audio_data)) or np.any(np.isinf(audio_data)):
        raise ValueError("Input audio data contains NaN or Inf values.")
    for lowcut, highcut, gain in bands:
        b, a = butter_bandpass(lowcut, highcut, sr)
        filtered = lfilter(b, a, audio_data)
        output += filtered * gain
    output = np.clip(output, -1.0, 1.0)  # 限制输出范围
    return output
def plot_signals_and_spectra(original_audio, equalized_audio, sr):
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(equalized_audio, sr=sr, alpha=0.5)
    plt.title('Equalized Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 4)
    D_equalized = librosa.amplitude_to_db(np.abs(librosa.stft(equalized_audio)), ref=np.max)
    librosa.display.specshow(D_equalized, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Equalized Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    equalized_audio = equalizer(original_audio, sr)
    plot_signals_and_spectra(original_audio, equalized_audio, sr)

在这里插入图片描述

5. 添加回声与延迟

  通过冲激响应处理,我们可以模拟房间或设备的声学特性。结合归一化、填充和延迟处理,我们可以生成具有特定声学特性的音频信号。以下是相关函数的实现:

import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
from scipy.signal import fftconvolve, correlate
def apply_impulse_response(audio, ir):
    if audio.ndim >= 2:
        audio = audio[0]
    if ir.ndim >= 2:
        ir = ir[0]
    processed_audio = fftconvolve(audio, ir, mode='full')[:len(audio)]
    return processed_audio
def normalize_audio(audio):
    return audio / np.max(np.abs(audio))
def pad_audio(original_audio, processed_audio, pad_samples):
    if pad_samples > 0:
        original_audio_padded = np.pad(original_audio, (0, pad_samples), mode='constant')
        processed_audio_padded = np.pad(processed_audio, (pad_samples, 0), mode='constant')
    else:
        original_audio_padded = np.pad(original_audio, (-pad_samples, 0), mode='constant')
        processed_audio_padded = np.pad(processed_audio, (0, -pad_samples), mode='constant')
    return original_audio_padded, processed_audio_padded
def calculate_delay(original_audio, processed_audio):
    correlation = correlate(processed_audio, original_audio)
    delay_samples = np.argmax(correlation) - (len(processed_audio) - 1)
    return delay_samples
def add_reverb_with_delay(audio_data, rir_data, delay_samples):
    rir_data = normalize_audio(rir_data)
    processed_audio = apply_impulse_response(audio_data, rir_data)
    processed_audio = normalize_audio(processed_audio)

    ori_delay = calculate_delay(audio_data, processed_audio)
    pad_samples = delay_samples - ori_delay
    original_audio_padded, processed_audio_padded = pad_audio(audio_data, processed_audio, pad_samples)
    final_delay = calculate_delay(original_audio_padded, processed_audio_padded)
    print(f"Final delay: {final_delay / 16:.2f} ms")
    return original_audio_padded, processed_audio_padded
def plot_signals_and_spectra(original_audio, processed_audio, sr):
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(processed_audio, sr=sr, alpha=0.5)
    plt.title('Processed Audio Signal with Reverb')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 4)
    D_processed = librosa.amplitude_to_db(np.abs(librosa.stft(processed_audio)), ref=np.max)
    librosa.display.specshow(D_processed, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Processed Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    rir_path = '/Volumes/T9/DATA/构建数据集/SELE/rir/large/SLR28_large_Room001-00001.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    rir_data, _ = librosa.load(rir_path, sr=None)
    delay_samples = 8000  # 设置延迟样本数
    original_audio,processed_audio = add_reverb_with_delay(original_audio, rir_data, delay_samples)
    plot_signals_and_spectra(original_audio, processed_audio, sr)

在这里插入图片描述

6. 非线性模拟

  非线性模拟用于模拟扬声器或其他设备的非线性特性。通过应用硬剪辑和非线性变换,我们可以生成更真实的音频信号。

import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
def simulate_nonlinearity(audio_data):
    clip_max = 0.3
    clipped_signal = np.clip(audio_data, -clip_max, clip_max)
    b = 1.5 * clipped_signal - 0.3 * clipped_signal ** 2
    gamma = np.random.uniform(0.15, 0.3)
    if np.any(b > 0):
        a = np.random.uniform(0.05, 0.45)
    else:
        a = np.random.uniform(0.1, 0.4)
    nonlinear_signal = gamma * (2 / (1 + np.exp(-a * b)))
    return nonlinear_signal * clipped_signal
def plot_signals_and_spectra(original_audio, processed_audio, sr):
    plt.figure(figsize=(12, 8))
    plt.subplot(2, 2, 1)
    librosa.display.waveshow(original_audio, sr=sr, alpha=0.5)
    plt.title('Original Audio Signal')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 2)
    D_original = librosa.amplitude_to_db(np.abs(librosa.stft(original_audio)), ref=np.max)
    librosa.display.specshow(D_original, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Original Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.subplot(2, 2, 3)
    librosa.display.waveshow(processed_audio, sr=sr, alpha=0.5)
    plt.title('Processed Audio Signal with Nonlinearity')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.subplot(2, 2, 4)
    D_processed = librosa.amplitude_to_db(np.abs(librosa.stft(processed_audio)), ref=np.max)
    librosa.display.specshow(D_processed, sr=sr, x_axis='time', y_axis='log', cmap='coolwarm')
    plt.title('Processed Audio Spectrum')
    plt.colorbar(format='%+2.0f dB')
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    audio_path = '/Volumes/T9/DATA/构建数据集/SELE/near_voice/WenetSpeech_CN_16k_0005458.wav'
    original_audio, sr = librosa.load(audio_path, sr=None)
    processed_audio = simulate_nonlinearity(original_audio)
    plot_signals_and_spectra(original_audio, processed_audio, sr)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp vue2版本如何设置i18n

如何设置i18n在该软件设置过语言的情况下优先选择所设置语言&#xff0c;在没有设置的情况下&#xff0c;获取本系统默认语言就&#xff0c;将系统默认语言设置为当前选择语言。 1、下载依赖&#xff1a; npm install vue-i18n --save 2、创建相关文件&#xff08;在最外层&…

vulnhub靶场【DC系列】之9 the final 结束篇

前言 靶机&#xff1a;DC-8&#xff0c;IP地址为192.168.10.11&#xff0c;后续因为靶机重装&#xff0c;IP地址变为192.168.10.13 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用VMWare&#xff0c;网卡为桥接模式 对于文章中涉及到的靶场以及工具&#xf…

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规&#xff1a;GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》&#xff08;CCPA&#xff09;3.1 背景3.2 主要内…

基于QT和C++的实时日期和时间显示

一、显示在右下角 1、timer.cpp #include "timer.h" #include "ui_timer.h" #include <QStatusBar> #include <QDateTime> #include <QMenuBar> Timer::Timer(QWidget *parent) :QMainWindow(parent),ui(new Ui::Timer) {ui->setup…

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…

【软考】软件设计师

「学习路线」&#xff08;推荐该顺序学习&#xff0c;按照先易后难排序&#xff09; 1、上午题—计算机系统&#xff08;5~6分&#xff09;[1.8; ] 2、上午题—程序设计语言&#xff08;固定6分&#xff09;[1.9; ] 3、下午题—试题一&#xff08;15分&#xff09; 4、上午题—…

2030年中国AI人才缺口或达400万,近屿智能助力AI人才储备增长

在当今数字化浪潮下&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各行业发展的关键力量。然而&#xff0c;吸引和留住 AI 人才正成为全球性难题&#xff0c;中国亦不例外。据麦肯锡 2022 年全球人工智能商业高管调查&#xff0c;75% 的中国受访者在招聘数据科学家…

一块钱的RISC-V 32位芯片

‍‍ ‍‍之前跟一个朋友聊天&#xff0c;说以后的芯片一定是越来越趋向于定制化&#xff0c;比如我们需要一个ADC芯片&#xff0c;这颗ADC芯片需要有串口功能&#xff0c;那就只开发一颗这样的芯片就好了&#xff0c;其他的功能都可以裁剪掉。 ➵➵➵➵➵➵➵➵➵➵➵➵➵➵➵…

rk3568平台Buildroot编译实践:内核rootfs定制 及常见编译问题

目录 编译前准备常规编译流程定制内核修改内核 参数并增量 保存修改rootfs并增量 保存修改rootfs包下载源rootfs软件包增删refBuildroot 是一个用于自动化构建嵌入式 Linux 系统的工具。它通过使用简单的配置文件和 Makefile,能够从源代码开始交叉编译出一个完整的、可以运行在…

机器翻译优缺点

随着科技的飞速发展&#xff0c;机器翻译是近年来翻译行业的热门话题&#xff0c;在人们的生活和工作中日益普及&#xff0c;使用机器能够提高翻译效率&#xff0c;降低成本。尽管关于机器翻译为跨语言交流带来了诸多便利&#xff0c;但在译文的正确率和局限性方面存在一定争议…

R 语言科研绘图 --- 折线图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

自动化测试:6大关键脚本类型及使用要点

测试脚本在自动化测试中扮演着至关重要的角色&#xff0c;特别是常见的六种关键脚本类型及其使用范围和注意事项&#xff0c;它们能够确保系统在不同负载和环境下稳定运行&#xff0c;保障接口交互的准确性和安全性&#xff0c;从而节省时间和人力成本&#xff0c;推动项目高效…

算法题(31):两数之和-输入有序数组

审题&#xff1a; 在确定有唯一解的前提下&#xff0c;找出两个下标对应的元素值之和等于target的下标&#xff0c;并存入数组中返回 思路&#xff1a; 方法一&#xff1a;暴力搜索&#xff08;超时&#xff09; 利用两个循环进行所有情况的枚举&#xff0c;让每个元素依次与其…

9 个大数据示例

被称为大数据的技术是数字时代最具影响力的创新之一。强大的分析揭示了隐藏在大量数据中的模式和相关性&#xff0c;几乎为所有行业的规划和决策提供依据。事实上&#xff0c;就在过去十年间&#xff0c;大数据的应用已经发展到几乎触及我们生活方式、购物习惯以及日常消费选择…

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中&#xff0c;从宏观层面来看&#xff0c;新技术的落地速度不断加快&#xff0c;各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析&#xff0c;企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…

基于Python编程语言的自动化渗透测试工具

摘 要 近些年来网络安全形势变得越来越严峻&#xff0c;全球数百万个政企遭遇过不同程度的网络攻击。渗透测试是一种对目标进行信息安全评估的方法&#xff0c;而目前该行业仍在存在着安全服务行业价格昂贵&#xff0c;安全人才缺口巨大&#xff0c;在渗透测试时步骤繁琐、效率…

【教程】数据可视化处理之2024年各省GDP排名预测!

过去的一年里&#xff0c;我国的综合实力显著提升&#xff0c;在新能源汽车、新一代战机、两栖攻击舰、航空航天、芯片电子、装备制造等领域位居全球前列。虽然全国各省市全年的经济数据公布还需要一段时间&#xff0c;但各地的工业发展数据&#xff0c;财政收入数据已大概揭晓…

Mysql快速列出来所有列信息

文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来&#xff0c;以备注中的中文名为列名。 实现思路 最终展示效果&#xff0c;即拼接出可执行执行…

数据结构(Java版)第七期:LinkedList与链表(二)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 一、链表的实现&#xff08;补&#xff09; 接上一期&#xff0c;下面我们要实现删除所有值为key的元素&#xff0c;这时候有的老铁就会想用我们上一期中讲到的remove方法&#xff0c;循环使用remove方法&#…