8、Web Audio API:音频参数连接、调制及分析

Web Audio API:音频参数连接、调制及分析

1. 音频节点连接基础

在简单的 Web Audio API 应用中,常见的连接方式是将一个音频节点的输出直接连接到另一个音频节点的输入。不过,实际上还有多种连接方式和更多的连接功能。

连接方法主要有以下几种:
- connect(AudioNode destinationNode, optional output, optional input)
- connect(AudioParam destinationParam, optional output)
- disconnect(optional output)
- disconnect(AudioNode destinationNode, optional output, optional input)
- disconnect(AudioParam destinationParam, optional output)

下面通过示例进行说明,假设有两个节点 nodeA nodeB nodeA 有音频参数 paramA nodeB 有音频参数 paramB
- 基本连接方式: nodeA.connect(nodeB)
- 带可选输出和输入索引的连接: nodeA.connect(nodeB, output, input) ,其中 output 表示 nodeA 的输出流索引, input 表示 nodeB 的输入流索引。
- 节点连接到参数: nodeA.connect(nodeB.paramB)
- 指定输出连接到参数: nodeA.connect(nodeB.paramB, output)

连接规则如下:
|规则描述|详情|
| ---- | ---- |
|输入节点输出求和|若音频节点有多个节点连接到其输入,这些节点的输出会相加形成输入缓冲区,再进行上下采样以匹配该音频节点的输入通道数。|
|连接到音频参数|参数会将连接的音频流进行下采样转换为单声道(如有需要),并与固有参数值相加。固有参数值是指没有音频连接时该参数的默认值。|
|连接上下文一致性|任何连接的目标(音频节点或音频参数)必须与发起连接的节点属于同一音频上下文,即 AudioNodes 不能在不同的 AudioContexts 之间共享。|
|多节点连接|多个音频节点可以连接到同一个音频节点或音频参数,一个音频节点也可以连接到多个音频节点和音频参数。|
|自连接|音频节点可以连接到自身、自身的参数,或连接到最终会返回到原节点或其参数的其他节点。|
|唯一连接|特定节点的给定输出与另一个特定节点的给定输入之间只能有一个连接,重复连接会被忽略。|

2. 断开节点连接

断开节点连接的选项比连接节点更多,例如可以在不指定连接目标的情况下断开节点的所有连接:
- nodeA.disconnect() :断开 nodeA 的所有连接。
- nodeA.disconnect(output) :断开 nodeA 指定输出的所有连接, output 是输出索引。
- disconnect(destinationNode, optional output, optional input) :断开到特定目标节点的所有输出,或断开到该目标的特定输出,或断开到目标特定输入的特定输出。
- disconnect(destinationParam, optional output) :断开到特定目标音频参数的所有输出,或断开到该目标的特定输出。

断开与音频参数的连接时,固有值不受影响。例如,有一个 ConstantSourceNode 的偏移量为 0.5,一个 GainNode 的增益值为 1,当 ConstantSourceNode 连接到 GainNode 的增益参数时,该增益参数的计算值变为 1 + 0.5 = 1.5;断开连接后,增益参数的计算值会恢复到固有值 1。

3. 连接音频参数

通过将其他节点连接到音频参数,可以改变该参数的值,如 someNode.connect(offset.value) ,此时连接节点的音频输出会与固有参数值相加。但问题是,如何让其他节点在给定时间输出所需的值。

需要注意的是,自动化曲线只重置参数的固有值。例如:

someConstantSourceNode.connect(someGainNode.gain);
someGainNode.gain.setValueAtTime(0, context.currentTime + 1);

一秒后,固有值会跳转到 0,但计算值是固有值与连接到音频参数的所有节点的总和。若使用默认值, GainNode 的增益为 1, ConstantSourceNode 的偏移量为 1,则计算得到的增益参数在一秒前为 1 + 1 = 2,一秒后为 0 + 1 = 1。

4. 频率调制(FM)合成示例

调制是指用调制信号(调制器信号)改变周期性波形(载波信号)的属性。频率调制(FM)合成是一种特殊的调制方式,它通过用另一个波形调制一个波形的频率来产生声音,由 John Chowning 在 1973 年首次发现。

以简单正弦波为例,改变振幅是振幅调制,改变频率是频率调制,改变相位是相位调制。这里主要进行的是相位调制,它比频率调制更常见,且两者效果相似。

载波定义为:$c(t) = A\sin(2\pi f_c t + \phi)$,其中 $f_c$ 是载波频率。用调制器 $m(t)$ 调制频率后,输出信号为:$s(t) = A\sin(2\pi (f_c + Dm(t)) t + \phi)$,其中 $f_m$ 是调制频率,$D$ 是调制深度。

以下是 Web Audio API 实现 FM 合成的代码示例:

<input type='button' value='Start/Stop' id='StartStop'>
<p>Carrier Frequency</p>
<input type='range' id='CarrierFrequency' min=50 max=2000 value=800 step='any'>
<span id='CarrierFrequencyLabel'></span>
<p>Modulation Depth</p>
<input type='range' id='ModulationDepth' min=0 max=1000 value=200 step='any'>
<span id='ModulationDepthLabel'></span>
<p>Modulation Frequency</p>
<input type='range' id='ModulationFrequency' min=10 max=200 value=100 step='any'>
<span id='ModulationFrequencyLabel'></span>
<script>
    //User Interface callbacks
    CarrierFrequency.oninput = function() {
        CarrierFrequencyLabel.innerHTML = this.value
        Carrier.frequency.value=this.value
    }
    ModulationDepth.oninput = function() {
        ModulationDepthLabel.innerHTML = this.value
        Modulator.gain.value=this.value
    }
    ModulationFrequency.oninput = function() {
        ModulationFrequencyLabel.innerHTML = this.value
        ModulatorOsc.frequency.value=this.value
    }
    StartStop.onclick = function() {
        if (context.state === 'suspended')
            context.resume()
        else
            context.suspend()
    }
</script>
<script src='FMSynthesis.js'></script>
//Define context and nodes
context = new AudioContext()
var Carrier = new OscillatorNode(context, {frequency:CarrierFrequency.value})
var ModulatorOsc = new OscillatorNode(context, {frequency:ModulationFrequency.value})
var Modulator = new GainNode(context, {gain:ModulationDepth.value})
//start any scheduled sources
Carrier.start()
ModulatorOsc.start()
//This multiples ModulatorOsc and modulation depth
ModulatorOsc.connect(Modulator)
//Carrier frequency is sum of intrinsic frequency offset & modulator
Modulator.connect(Carrier.frequency)
Carrier.connect(context.destination)

在这个示例中,调制器连接到载波的频率参数,计算得到的频率是固有频率值与调制器当前值的总和,从而实现对载波频率的调制。

5. 振幅调制(AM)合成示例

振幅调制(AM)和频率调制(FM)一样,既用于广播协议,也用于音频合成。FM 技术通过调制频率改变载波信号的频率,而 AM 则通过调制频率改变载波的振幅。FM 保真度更高,因为它更不易受干扰,但 AM 仍用于新闻和体育等基于语音的广播。

载波信号为正弦波,用调制器调制振幅后,输出信号为:$s(t) = A(1 + Dm(t))\sin(2\pi f_c t + \phi)$,其中 $f_m$ 是调制频率,$D$ 是调制深度。

以下是 Web Audio API 实现 AM 合成的代码示例:

<input type='button' value='Start/Stop' id='StartStop'>
<p>Carrier Frequency</p>
<input type='range' id='CarrierFrequency' min=50 max=2000 value=800 step='any'>
<span id='CarrierFrequencyLabel'></span>
<p>Modulation Depth</p>
<input type='range' id='ModulationDepth' min=0 max=1 value=0.1 step='any'>
<span id='ModulationDepthLabel'></span>
<p>Modulation Frequency</p>
<input type='range' id='ModulatorFrequency' min=10 max=200 value=100 step='any'>
<span id='ModulatorFrequencyLabel'></span>
<script>
    CarrierFrequency.oninput = function() {
        CarrierFrequencyLabel.innerHTML = this.value
        Carrier.frequency.value=this.value
    }
    ModulationDepth.oninput = function() {
        ModulationDepth.innerHTML = this.value
        Modulator.gain.value=this.value
    }
    ModulatorFrequency.oninput = function() {
        ModulatorFrequencyLabel.innerHTML = this.value
        ModulatorOsc.frequency.value=this.value
    }
    StartStop.onclick = function() {
        if (context.state === 'suspended')
            context.resume()
        else
            context.suspend()
    }
</script>
<script src='AMSynthesis.js'></script>
context = new AudioContext()
var Carrier = new OscillatorNode(context)
var ModulatorOsc = new OscillatorNode(context, {frequency:100,type:'square'})
var Modulator = context.createGain()
var AM = context.createGain()
Carrier.start()
ModulatorOsc.start()
ModulatorOsc.connect(Modulator)
Modulator.connect(AM.gain)
Carrier.connect(AM)
AM.connect(context.destination)
6. 颤音(Tremolo)和震音(Vibrato)效果

当调制频率约为 6 Hz 时,振幅调制信号类似于颤音效果。这通常使用低频振荡器(LFO)实现,LFO 是频率设置为非常低的值(通常在 0.5 到 10 Hz 之间)的振荡器。LFO 在音频效果和合成器中非常常见,是颤音、合唱和相位等效果的核心构建块。

随着频率接近音频速率(20 Hz),声音会变得粗糙。超过 20 Hz 时,我们无法听到振幅的周期性下降,而是开始听到边带频率或组合音,如和音(载波和调制器频率之和 $f_c + f_m$)和差音(载波和调制器频率之差 $f_c - f_m$)。

颤音与 AM 合成相关,震音与 FM 合成相关。不过,震音的实现方式与 FM 合成不同,通常通过改变延迟线的延迟来实现,即将 LFO 连接到 DelayNode 的延迟参数。

7. 环形调制(Ring Modulation)

环形调制是一种简单的振幅调制方式,调制器和载波直接相乘。与其他 AM 方法不同,环形调制允许生成的波形振幅降至零,而其他 AM 方法包含直流偏移,起到深度或强度控制的作用。也就是说,AM 使用单极调制波(不会低于零),而环形调制使用双极调制波。

可以基于 AM 合成的代码示例实现环形调制,只需在载波与调制器相乘时将固有增益设置为 0,即在 AM.gain.value = 0 后添加 var AM = context.createGain()

8. 音频分析与可视化 - AnalyserNode

Web Audio API 中的 AnalyserNode 可以用于音频分析和可视化。它既可以作为目标节点,也可以作为中间节点,不会修改传入的音频,而是提供用于分析、可视化或计量目的的音频流数据,数据可以是时域或频域的。

使用 AnalyserNode 进行音频分析的步骤如下:
1. 创建 AnalyserNode 实例。
2. 将其放置在音频图的适当位置。
3. 获取时域或频域数据进行分析或可视化。

AnalyserNode 有四个可选参数来定制输出:
- fftSize :定义用于频域分析的快速傅里叶变换(FFT)的缓冲区大小,以及时域分析的缓冲区大小。必须是 32($2^5$)到 32768($2^{15}$)之间的 2 的幂,默认值为 2048($2^{11}$)。较高的值会带来更精细的信号分析,但会牺牲一些性能。
- minDecibels (默认 -100):定义频率区间的最小功率(dB)。
- maxDecibels (默认 -30):定义频率区间的最大功率(dB)。

以下是简单的可视化示例代码框架:

const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const analyser = audioContext.createAnalyser();
// 设置参数
analyser.fftSize = 2048;
analyser.minDecibels = -100;
analyser.maxDecibels = -30;

// 获取音频源并连接到 analyser
const source = audioContext.createMediaElementSource(audioElement);
source.connect(analyser);
analyser.connect(audioContext.destination);

// 获取频域数据
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);

function draw() {
    requestAnimationFrame(draw);

    analyser.getByteFrequencyData(dataArray);

    // 在这里进行可视化操作,例如绘制柱状图
    // ...
}

draw();

通过以上内容,我们了解了 Web Audio API 中音频节点的连接、调制以及分析可视化的相关知识和实现方法,利用这些技术可以创建出丰富多样的音频效果和应用。

Web Audio API:音频参数连接、调制及分析

9. 音频节点连接与断开规则总结

为了更清晰地理解音频节点的连接与断开操作,我们对前面的内容进行总结,以下是相关规则的表格呈现:
|操作类型|方法|说明|
| ---- | ---- | ---- |
|连接节点| connect(AudioNode destinationNode, optional output, optional input) |将一个音频节点的输出连接到另一个音频节点的输入,可指定输出和输入索引|
|连接到参数| connect(AudioParam destinationParam, optional output) |将一个音频节点的输出连接到另一个节点的音频参数,可指定输出索引|
|断开所有连接| disconnect() |断开节点的所有连接|
|断开指定输出连接| disconnect(output) |断开节点指定输出的所有连接|
|断开到目标节点连接| disconnect(destinationNode, optional output, optional input) |断开到特定目标节点的所有输出,或特定输出,或特定输入的特定输出|
|断开到目标参数连接| disconnect(destinationParam, optional output) |断开到特定目标音频参数的所有输出,或特定输出|

以下是音频节点连接与断开操作的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B{选择操作类型}:::decision
    B -->|连接节点| C(connect(AudioNode, optional output, optional input)):::process
    B -->|连接到参数| D(connect(AudioParam, optional output)):::process
    B -->|断开所有连接| E(disconnect()):::process
    B -->|断开指定输出连接| F(disconnect(output)):::process
    B -->|断开到目标节点连接| G(disconnect(destinationNode, optional output, optional input)):::process
    B -->|断开到目标参数连接| H(disconnect(destinationParam, optional output)):::process
    C --> I([结束]):::startend
    D --> I
    E --> I
    F --> I
    G --> I
    H --> I
10. 调制效果对比分析

我们对前面介绍的几种调制效果(FM 合成、AM 合成、颤音、震音、环形调制)进行对比分析,以便更好地理解它们的特点和应用场景,具体如下表所示:
|调制效果|原理|特点|应用场景|
| ---- | ---- | ---- | ---- |
|FM 合成|用调制器波形调制载波波形的频率|可产生丰富多样的声音,常用于创造独特的音效|电子音乐制作、游戏音效等|
|AM 合成|用调制器波形调制载波波形的振幅|实现相对简单,在广播和音频合成中都有应用|新闻、体育广播,简单音频效果制作|
|颤音|调制频率约为 6 Hz 的振幅调制|声音有周期性的振幅变化,类似颤音效果|音乐表演中的情感表达,营造特定氛围|
|震音|与 FM 合成相关,通过改变延迟线延迟实现|声音有频率的周期性变化|音乐表演中的表现力增强|
|环形调制|调制器和载波直接相乘|允许波形振幅降至零,产生独特的声音效果|实验性音乐创作、特殊音效制作|

11. 音频分析与可视化的深入探讨

AnalyserNode 为音频分析和可视化提供了强大的功能,我们可以进一步探讨其在实际应用中的一些要点。

11.1 时域和频域数据的应用
  • 时域数据 :反映了音频信号随时间的变化情况,可用于检测音频的起始、结束时间,以及音频信号的瞬时幅度变化。例如,在音频剪辑软件中,可以通过时域数据来精确地裁剪音频片段。
  • 频域数据 :展示了音频信号在不同频率上的分布情况,可用于分析音频的音高、音色等特征。在音乐制作中,可以根据频域数据来调整音频的均衡器,突出或抑制某些频率范围的声音。
11.2 性能优化

在使用 AnalyserNode 进行音频分析和可视化时,性能优化是一个重要的考虑因素。由于 fftSize 的值越大,分析越精细,但性能开销也越大,因此需要根据实际需求选择合适的 fftSize 。例如,在实时音频处理场景中,如果对分析精度要求不是特别高,可以选择较小的 fftSize 以提高性能。

12. 综合应用示例 - 自定义音频效果器

结合前面介绍的音频节点连接、调制和分析可视化知识,我们可以创建一个自定义的音频效果器。以下是一个简单的实现思路和代码示例:

12.1 实现思路
  1. 创建音频上下文和相关节点,包括振荡器、增益节点、分析节点等。
  2. 通过用户界面控制音频节点的参数,如频率、振幅、调制深度等。
  3. 使用 AnalyserNode 对音频信号进行分析,并将分析结果可视化。
12.2 代码示例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Custom Audio Effect</title>
</head>

<body>
    <input type='button' value='Start/Stop' id='StartStop'>
    <p>Carrier Frequency</p>
    <input type='range' id='CarrierFrequency' min=50 max=2000 value=800 step='any'>
    <span id='CarrierFrequencyLabel'></span>
    <p>Modulation Depth</p>
    <input type='range' id='ModulationDepth' min=0 max=1000 value=200 step='any'>
    <span id='ModulationDepthLabel'></span>
    <p>Modulation Frequency</p>
    <input type='range' id='ModulationFrequency' min=10 max=200 value=100 step='any'>
    <span id='ModulationFrequencyLabel'></span>
    <canvas id="visualizer"></canvas>
    <script>
        const context = new AudioContext();
        const carrier = new OscillatorNode(context, { frequency: document.getElementById('CarrierFrequency').value });
        const modulatorOsc = new OscillatorNode(context, { frequency: document.getElementById('ModulationFrequency').value });
        const modulator = context.createGain();
        const analyser = context.createAnalyser();

        carrier.start();
        modulatorOsc.start();

        modulatorOsc.connect(modulator);
        modulator.connect(carrier.frequency);
        carrier.connect(analyser);
        analyser.connect(context.destination);

        const canvas = document.getElementById('visualizer');
        const canvasContext = canvas.getContext('2d');
        const bufferLength = analyser.frequencyBinCount;
        const dataArray = new Uint8Array(bufferLength);

        function draw() {
            requestAnimationFrame(draw);

            analyser.getByteFrequencyData(dataArray);

            canvasContext.clearRect(0, 0, canvas.width, canvas.height);
            const barWidth = (canvas.width / bufferLength) * 2.5;
            let barHeight;
            let x = 0;

            for (let i = 0; i < bufferLength; i++) {
                barHeight = dataArray[i];

                canvasContext.fillStyle = 'rgb(' + (barHeight + 100) + ',50,50)';
                canvasContext.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2);

                x += barWidth + 1;
            }
        }

        draw();

        document.getElementById('CarrierFrequency').oninput = function () {
            document.getElementById('CarrierFrequencyLabel').innerHTML = this.value;
            carrier.frequency.value = this.value;
        }

        document.getElementById('ModulationDepth').oninput = function () {
            document.getElementById('ModulationDepthLabel').innerHTML = this.value;
            modulator.gain.value = this.value;
        }

        document.getElementById('ModulationFrequency').oninput = function () {
            document.getElementById('ModulationFrequencyLabel').innerHTML = this.value;
            modulatorOsc.frequency.value = this.value;
        }

        document.getElementById('StartStop').onclick = function () {
            if (context.state === 'suspended')
                context.resume();
            else
                context.suspend();
        }
    </script>
</body>

</html>

通过以上代码,我们创建了一个简单的音频效果器,用户可以通过滑块控制载波频率、调制深度和调制频率,同时在画布上实时可视化音频的频域数据。

综上所述,Web Audio API 提供了丰富的功能和灵活的操作方式,通过合理运用音频节点的连接、调制以及分析可视化技术,我们可以开发出各种富有创意和实用价值的音频应用。无论是音乐制作、游戏开发还是音频处理工具,都可以借助 Web Audio API 实现更加出色的音频效果。

内容概要:本文围绕“基于分布式模型预测控制的多个固定翼无人机一致性控制”展开,利用Matlab代码实现相关算法的仿真,旨在通过分布式控制策略实现多架固定翼无人机在复杂动态环境中的协同飞行与一致性控制。研究结合模型预测控制(MPC)方法,构建适用于多无人机系统的分布式优化框架,重点解决了通信受限、信息延迟及无中心化指挥条件下的协同稳定性问题。内容涵盖固定翼无人机的动力学建模、分布式MPC优化求解机制、一致性协议设计、通信拓扑结构分析以及仿真验证全过程,确保多机系统在保持队形一致的同时完成协同任务。; 适合人群:具备自动控制理论、无人机系统建模或多智能体协同控制基础,从事智能无人系统、集群控制、自动化与机器人等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多无人机协同编队飞行、集群侦察、分布式任务执行等实际工程场景;②为分布式MPC算法在多智能体系统中的一致性控制提供可复现的Matlab仿真案例,推动先进控制理论向工程实践转化;③服务于科研论文复现、算法验证、控制系统课程设计与毕业课题参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,重点关注分布式MPC在不同通信拓扑下对一致性收敛性能的影响,并可通过调整预测时域、权重矩阵与噪声参数等方式深化对算法鲁棒性与适应性的理解。
内容概要:本文提出了一种基于变分模态分解(VMD)、麻雀搜索算法(SSA)优化与长短期记忆网络(LSTM)相结合的光伏功率预测模型(VMD-SSA-LSTM),旨在提升光伏发电预测的精度与鲁棒性。该方法首先利用VMD对原始非平稳光伏功率序列进行自适应分解,获得一系列具有更稳定特征的本征模态分量(IMFs),有效降低数据复杂性与噪声干扰;随后引入麻雀搜索算法(SSA)对LSTM网络的关键超参数(如学习率、隐层节点数等)进行全局寻优,克服传统试凑法效率低、易陷入局部最优的问题,显著提升模型收敛速度与泛化能力;最后,构建多个LSTM子模型分别预测各模态分量,并将结果重构得到最终的光伏功率预测值。该混合模型充分融合了VMD在信号预处理中的优异分解性能、SSA在参数优化中的高效搜索能力以及LSTM在捕捉时间序列长期依赖关系上的强大建模优势,实现了对复杂气象因素影响下光伏出力波动的高精度拟合与预测。; 适合人群:具备一定电力系统、新能源发电或时间序列预测基础知识,熟悉MATLAB编程环境,从事光伏功率预测、智能电网调度、可再生能源集成、负荷预测等领域研究的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于光伏电站的短期与超短期功率预测,为电网安全调度、电力市场交易、储能系统配置及需求侧响应提供精准数据支撑;②解决传统单一预测模型(如ARIMA、BPNN、单一LSTM)在处理非平稳、强波动性光伏数据时存在的精度不足、稳定性差等问题;③为风电、负荷等其他非平稳时序预测问题提供一种有效的“分解-优化-预测”混合建模范式与技术实现路径。; 阅读建议:建议读者结合文中提供的完整MATLAB代码,深入理解VMD信号分解、SSA优化算法流程及LSTM网络构建的每一个技术环节,通过实际历史数据进行模型复现与对比实验(如与VMD-LSTM、SSA-LSTM等模型比较),掌握参数调优技巧与模型性能评估方法,从而真正掌握该先进混合预测模型的核心思想与应用精髓。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 在当代信息技术行业,深度学习技术的应用已经全面渗透到众多实际情境中,其中生成对抗网络(GAN)以及深度卷积生成对抗网络(DCGAN)被视为促进人工智能领域发展的核心技术之一。接下来将具体阐述如何借助Pytorch框架与MNIST数据集来完成基础GAN和DCGAN的开发,并解析过程中涉及的关键概念。 ### Pytorch框架与MNIST数据集概述 **Pytorch** 被视为一种广受欢迎的开源机器学习平台,其具备动态计算图与高度适应性等特性,因此在学术研究领域备受推崇,能够支持多种类型的深度学习架构。 **MNIST数据集** 是一个包含手写数字的图像集合,常用于训练各类图像识别系统,涵盖从0至9的数字图像,每张图像的尺寸为28x28像素。由于其入门级难度,MNIST数据集特别适合用于教学演示和实验操作。 ### 基础生成对抗网络(GAN)核心概念 **基础GAN** 是一种由生成器(Generator)和判别器(Discriminator)构成的无监督学习框架。生成器的核心任务是创造足以乱真的图像数据,而判别器的关键职责在于精确辨别真实图像与生成图像之间的差异。 1. **生成器**:该模块以随机噪声为输入,通过深度神经网络进行转换,最终输出接近真实图像的数据。其根本目的在于迷惑判别器。 2. **判别器**:对输入数据(无论是真实图像还是生成图像)进行评估,并输出其属于真实样本的概率。判别器的训练重点在于提升识别的精确度。 3. **训练机制**:GAN的训练过程涉及两个网络之间的交替训练,即在锁定一个网络参数的情况下对另一个网络进行训练。首先优化判别器以增强其区分能力...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值