在本章中,我们介绍了一个称为IQ采样的概念,又名复数采样或正交采样。我们还涵盖了奈奎斯特采样、复数、射频载波、下变频和功率谱密度。IQ 采样是 SDR 以及许多数字接收器(和发射器)执行的采样形式。这是常规数字采样(双关语)的稍微复杂的版本,因此我们将慢慢来,并且通过一些练习,这个概念肯定会掌握!

采样基础知识

在进入IQ抽样之前,让我们讨论一下抽样的实际含义。您可能遇到过采样而没有意识到的情况,如使用麦克风录制音频。麦克风是将声波转换为电信号(电压电平)的换能器。该电信号由模数转换器(ADC)转换,产生声波的数字表示。为了简化起见,麦克风捕获转换为电能的声波,而声波又转化为数字。ADC充当模拟域和数字域之间的桥梁。特别和SDR惊人地相似。然而,它们不是麦克风,而是使用天线,尽管它们也使用ADC。在这两种情况下,电压电平均使用ADC进行采样。对于SDR,先考虑无线电波,然后再考虑数字。

无论我们处理的是音频还是无线电频率,如果要以数字方式捕获、处理或保存信号,都必须采样。采样可能看起来很简单,但有很多东西。考虑对信号进行采样的一种更具技术性的方法是及时抓取值并以数字方式保存它们。假设我们有一些随机函数 S(t) ,它可以表示任何东西,它是一个我们想要采样的连续函数:
我们以 T 秒的固定间隔记录 S(t) 的值,称为采样周期。我们采样的频率,即每秒采集的样本数量,只是 。我们称之为采样率,它是采样周期的倒数。例如,如果我们的采样率为 10 Hz,则采样周期为 0.1 秒;每个样本之间将有 0.1 秒。实际上,我们的采样率将在数百kHz到数十MHz甚至更高。当我们对信号进行采样时,我们需要注意采样率,这是一个非常重要的参数。
对于那些喜欢看数学的人;让 表示样本 n ,通常是一个从 0 开始的整数。使用此约定,采样过程可以用数学方式表示为 n 的整数值。即,我们以 nT 的这些间隔评估模拟信号 S(t) 。

奈奎斯特采样

对于给定的信号,最大的问题通常是我们必须以多快的速度采样?让我们检查一个信号,它只是一个频率为f的正弦波,如下所示的绿色。假设我们以 Fs 速率采样(样本以蓝色显示)。如果我们以等于f的速率(即Fs = f)对该信号进行采样,我们将得到如下所示的内容:上图中的红色虚线重建了一个不同的(不正确的)函数,该函数可能导致记录相同的样本。这表明我们的采样率太低,因为相同的样本可能来自两个不同的函数,导致歧义。如果我们想准确地重建原始信号,我们就不能有这种模糊性。
让我们尝试更快地采样,在 Fs = 1.2f 时:
再一次,有一个不同的信号可以适合这些样本。这种模糊性意味着,如果有人给我们这个样本列表,我们无法根据我们的采样区分哪个信号是原始信号。
在 Fs = 1.5f 时采样怎么样:
还是不够快!根据我们不会深入研究的DSP理论,您必须以信号频率的两倍进行采样,以消除我们正在经历的歧义:

这次没有不正确的信号,因为我们采样得足够快,除了你看到的信号之外,不存在适合这些样本的信号(除非你的频率更高,但我们稍后会讨论)。
在上面的例子中,我们的信号只是一个简单的正弦波,大多数实际信号都会有许多频率分量。为了准确地对任何给定信号进行采样,采样率必须“至少是最大频率分量频率的两倍”。下面是使用示例频域图的可视化,请注意,总会有本底噪声,因此最高频率通常是近似值:
我们必须确定最高频率的分量,然后将其加倍,并确保以该速率或更快的速率采样。我们可以采样的最小速率称为奈奎斯特速率。换句话说,奈奎斯特速率是需要对(有限带宽)信号进行采样以保留其所有信息的最小速率。它是DSP和SDR中极其重要的理论,是连续信号和离散信号之间的桥梁。
如果我们的采样速度不够快,我们会得到一种叫做混叠的东西,我们稍后会学习,但我们试图不惜一切代价避免它。我们的SDR(以及大多数接收器)的作用是在执行采样之前过滤掉Fs/2以上的所有内容。如果我们尝试接收采样率过低的信号,该滤波器将切断部分信号。我们的 SDR 不遗余力地为我们提供没有混叠和其他缺陷的样本。

正交采样

术语“正交”有很多含义,但在DSP和SDR的上下文中,它指的是两个异相90度的波。为什么 90 度异相?考虑一下两个异相 180 度的波本质上是同一个波,其中一个乘以 -1。通过90度的相位偏差,它们变得正交,你可以用正交函数做很多很酷的事情。为了简单起见,我们使用正弦和余弦作为两个异相90度的正弦波。
接下来,让我们分配变量来表示正弦和余弦的振幅。我们将使用 I 表示 cos(),使用 Q 表示 sin():

我们可以通过绘制等于 1 的 I 和 Q 来直观地看到这一点:
我们称 cos() 为“同相”(in phase)分量,因此得名 I,sin() 是 90 度异相或“正交”分量,因此 Q。虽然如果你不小心把它混了,把Q赋给cos(),把I赋给sin(),在大多数情况下都不会有什么区别。
通过使用发射器的观点,即考虑通过空中传输RF信号的任务,更容易理解IQ采样。我们想在某个相位发送单个正弦波,这可以通过发送相位为 0 的 sin() 和 cos() 之和来完成,因为三角恒等式: .假设 x(t) 是我们要传输的信号:

当我们添加正弦和余弦时会发生什么?或者更确切地说,当我们添加两个异相 90 度的正弦曲线时会发生什么?在下面的视频中,有一个用于调整 I 的滑块和另一个用于调整 Q 的滑块。绘制的是余弦、正弦,然后是两者的总和。
结果是我们的发射器将看起来像这样:重要的要点是,当我们添加 cos() 和 sin() 时,我们会得到另一个具有不同相位和振幅的纯正弦波。此外,当我们慢慢删除或添加两个部分之一时,相移。振幅也会发生变化。这都是三角恒等式的结果:,我们稍后会回到这一点。这种行为的作用是,我们可以通过调整振幅I和Q来控制产生的正弦波的相位和幅度(我们不必调整余弦或正弦的相位)。例如,我们可以调整I和Q,使振幅保持恒定,并使相位成为我们想要的任何内容。作为发射器,这种能力非常有用,因为我们知道我们需要传输正弦信号才能使其以电磁波的形式在空气中飞行。与调整振幅和相位相比,调整两个振幅并执行加法操作要容易得多。
我们只需要生成一个正弦波并将其移动 90 度即可获得 Q 部分。

复数

IQ 协议是表示量级和相位的另一种方式,它导致我们得到复数以及在复平面上表示它们的能力。你可能在其他类中见过复数。以复数0.7-0.4j为例:
复数实际上只是两个数字在一起,一个实部和一个虚部。复数也有大小和相位,如果你把它看作是一个向量而不是一个点,这更有意义。幅度是原点和点之间的直线长度(即矢量的长度),而相位是矢量与 0 度之间的角度,我们将其定义为正实轴:
正弦曲线的这种表示称为“向量图”。它只是绘制复数并将它们视为向量。现在我们的示例复数 0.7-0.4j 的大小和相位是多少?对于给定的复数,其中 a 是实部, b 是虚部:
在 Python 中,您可以使用 np.abs(x) 和 np.angle(x) 作为幅度和相位。输入可以是复数或复数数组,输出将是实数(数据类型为浮点数)。
你现在可能已经弄清楚这个向量或相量图与IQ协议的关系:I 是实数,Q 是虚数。从这一点开始,当我们绘制复平面时,我们将用 I 和 Q 标记它,而不是实数和虚构。它们仍然是复数!
现在假设我们要传输我们的示例点 0.7-0.4j。我们将传输:
我们可以使用三角恒等式,其中 A 是我们找到的幅度 是我们的相位等于上面的等式现在变为:
尽管我们从一个复数开始,但我们传输的是真实的,这很好,因为你实际上无法用电磁波传输虚构的东西。我们只是使用虚数/复数来表示我们正在传输的内容。我们稍后将讨论 f 。

FFT 中的复数

上述复数被假定为时域样本,但当您使用 FFT 时,您也会遇到复数。当我们在上一章介绍傅里叶级数和FFT时,我们还没有深入到复数。当您获取一系列样本的FFT时,它会找到频域表示。我们讨论了FFT如何计算出这组样本中存在哪些频率(FFT的幅度表示每个频率的强度)。但是FFT所做的也是找出应用于每个频率所需的延迟(时移),以便可以将一组正弦波相加以重建时域信号。这种延迟只是FFT的阶段。FFT的输出是一个复数数组,每个复数给你幅度和相位,该数的索引给你频率。 如果你在这些频率/幅度/相位下生成正弦波并将它们相加,你将得到原始时域信号(或非常接近它的东西,这就是奈奎斯特采样定理发挥作用的地方)。

接收器端

现在让我们从尝试接收信号(例如,FM无线电信号)的无线电接收器的角度出发。使用 IQ 采样,图表现在如下所示: 传入的是我们的天线接收到的真实信号,这些信号被转换为 IQ 值。我们要做的是使用两个ADC分别对I和Q分支进行采样,然后将对组合并将它们存储为复数。换句话说,在每个时间步长,您将采样一个 I 值和一个 Q 值,并将它们组合成形式(即每个 IQ 样本一个复数)。总会有一个“采样率”,即执行采样的速率。有人可能会说,“我有一个以 2 MHz 采样率运行的 SDR。他们的意思是SDR每秒接收200万个IQ样本。
如果有人给你一堆IQ样本,它看起来像一个复数的 1D 数组/向量。这一点,无论复杂与否,都是整个章节一直在构建的内容,我们终于做到了。
在本教程中,您将非常熟悉 IQ 样本的工作原理、如何使用 SDR 接收和传输它们、如何在 Python 中处理它们以及如何将它们保存到文件中以供以后分析。
最后一个重要说明:上图显示了SDR内部发生的事情。我们实际上不必产生正弦波、移位 90、乘法或加法——SDR 为我们做到了这一点。我们告诉SDR我们想要采样的频率,或者我们想要以什么频率传输样本。在接收器方面,SDR 将为我们提供 IQ 样本。对于发送端,我们必须向SDR提供IQ样本。 就数据类型而言,它们要么是复杂的整数,要么是浮点数。

载波和下变频(Carrier and Downconversion)

到目前为止,我们还没有讨论频率,但我们看到在涉及 cos() 和 sin() 的方程中有一个 f 。这个频率是我们实际通过空气发送的正弦波的频率(电磁波的频率)。我们将其称为“载体”,因为它以一定的频率传输我们的信息。当我们使用 SDR 调谐到某个频率并接收样本时,我们的信息存储在 I 和 Q 中;假设我们调谐到载波,此载波不会出现在 I 和 Q 中。
作为参考,FM收音机,WiFi,蓝牙,LTE,GPS等无线电信号通常使用100 MHz至6 GHz之间的频率(即载波)。这些频率在空中传播得非常好,但它们不需要超长的天线或大量的功率来发射或接收。您的微波炉用 2.4 GHz 的电磁波烹饪食物。如果门有漏水,那么您的微波炉会干扰WiFi信号,并可能烫伤您的皮肤。电磁波的另一种形式是光。可见光的频率约为 500 THz。它是如此之高,以至于我们不使用传统的天线来传输光。我们使用像LED这样的方法,这些方法都是半导体器件。当电子跳入半导体材料的原子轨道之间时,它们会产生光,颜色取决于它们跳多远。从技术上讲,射频 (RF) 定义为大约 20 kHz 到 300 GHz 的范围。 这些是来自振荡电流的能量可以从导体(天线)辐射并在空间中传播的频率。100 MHz至6 GHz范围是更有用的频率,至少对于大多数现代应用而言。6 GHz以上的频率几十年来一直用于雷达和卫星通信,现在正用于5G“毫米波”(24 - 29 GHz)以补充较低频段并提高速度。
当我们快速改变我们的IQ值并传输我们的载波时,它被称为“调制”载波(用数据或任何我们想要的东西)。当我们改变I和Q时,我们改变了载流子的相位和幅度。另一种选择是改变载波的频率,即稍微向上或向下移动它,这就是 FM 收音机所做的。
举个简单的例子,假设我们传输 IQ 样本 1+0j,然后我们切换到传输 0+1j。我们从发送到 ,这意味着当我们从一个样品切换到另一个样品时,我们的载流子会将相位偏移 90 度。
现在回到采样一会。如果我们将天线上的信号馈送到单个ADC中,就像我们刚刚讨论的直接采样架构中那样,而不是通过将天线发出的信号乘以cos()和sin()然后记录I和Q来接收样本?假设载波频率为 2.4 GHz,例如 WiFi 或蓝牙。这意味着我们必须以4.8 GHz的频率进行采样,正如我们所了解到的那样。这太快了!一个快速采样的ADC要花费数千美元。相反,我们对信号进行“下变频”,以便我们想要采样的信号以直流或0 Hz为中心。这种下转换发生在我们采样之前。我们从:
得到只有I和Q。
让我们可视化频域中的下变频:
当我们以 0 Hz 为中心时,最大频率不再是 2.4 GHz,而是基于我们移除载波后的信号特性。大多数信号的带宽宽度约为100 kHz至40 MHz,因此通过下变频,我们可以以低得多的速率进行采样。B2X0 USRP和PlutoSDR都包含一个RF集成电路(RFIC),可以采样高达56 MHz,这对于我们将遇到的大多数信号来说已经足够高了。
重申一下,下转换过程由我们的 SDR 执行 ;作为SDR的用户,除了告诉它调谐到哪个频率之外,我们不需要做任何事情。下变频(和上变频)由称为混频器的组件完成 ,通常在图中表示为圆圈内的乘法符号。混频器接收信号,输出下/上变频信号,并具有第三个端口,用于馈入振荡器。振荡器的频率决定了应用于信号的频移,混频器本质上只是一个乘法函数(回想一下,乘以正弦波会导致频移)。
最后,您可能好奇信号在空气中传播的速度有多快。回想一下高中物理课上的无线电波只是低频(大约在 3 kHz 到 80 GHz 之间)的电磁波。可见光也是电磁波,频率要高得多(400 THz 至 700 THz)。所有电磁波都以光速传播,大约是3e8 m / s,至少在空气或真空中传播时是这样。现在,由于它们始终以相同的速度行进,因此波在一次完全振荡(正弦波的一个完整周期)中传播的距离取决于其频率。我们将这个距离称为波长,表示为 。你以前可能见过这种关系:
其中 c 是光速,当 f 以 Hz 为单位且 \lambda 以米为单位时,通常设置为 3e8。在无线通信中,当我们到达天线时,这种关系变得很重要,因为要接收特定载波频率的信号, f ,您需要一个与其波长匹配的天线, ,通常天线的长度为 。然而,无论频率/波长如何,该信号中携带的信息将始终以光速从发射器传播到接收器。在计算这种通过空气的延迟时,经验法则是光在一纳秒内传播大约一英尺。另一个经验法则:在整个旅程中,信号传输到地球静止轨道上的卫星并返回大约需要0.25秒。

接收器架构

“接收器侧”部分中的图演示了输入信号如何下变频并分成I和Q。这种安排称为“直接变频”或“零中频”,因为RF频率直接转换为基带。另一种选择是完全不下变频,并且采样速度如此之快,以捕获从 0 Hz 到 1/2 采样率的所有内容。这种策略称为“直接采样”或“直接RF”,它需要极其昂贵的ADC芯片。第三种架构很受欢迎,因为它是旧无线电的工作方式,被称为“超外差”。它涉及下变频,但不是一直到0 Hz。它将感兴趣的信号置于中频,称为“IF”。低噪声放大器(LNA)只是一种设计用于输入端极低功率信号的放大器。以下是这三种架构的框图,请注意,这些架构的变体和混合也存在:

基带和带通信号

我们将以 0 Hz 为中心的信号称为“基带”。相反,“带通”是指信号存在于某个远不接近0 Hz的RF频率上,该信号已出于无线传输的目的而向上移动。没有“基带传输”的概念,因为你不能传输虚构的东西。基带上的信号可能完全以0 Hz为中心,如上一节中图的右侧部分所示。它可能接近 0 Hz,如下所示的两个信号。这两个信号仍被视为基带。还显示了一个示例带通信号,以非常高的频率为中心,标记为
您可能还会听到术语中频(缩写为 IF);现在,将IF视为基带和带通/RF之间的无线电中的中间转换步骤。
我们倾向于在基带上创建、记录或分析信号,因为我们可以在较低的采样率下工作(原因在上一小节中讨论过)。需要注意的是,基带信号通常是复杂的信号,而带通信号(例如,我们实际通过RF传输的信号)是真实的。想一想:因为通过天线馈送的信号必须是真实的,所以你不能直接传输复杂/虚构的信号。如果信号的负频和正频部分不完全相同,您就会知道信号肯定是复杂的信号。毕竟,复数是我们表示负频率的方式。实际上没有负频率;它只是低于载波频率的信号部分。
在前面的部分中,我们使用了复点0.7 - 0.4j,这基本上是基带信号中的一个样本。大多数时候,您看到复杂的样本(IQ样本),您处于基带。信号很少以数字方式表示或存储在RF中,因为它需要大量数据,而且我们通常只对RF频谱的一小部分感兴趣。

直流尖峰和失调调谐 (DC Spike and Offset Tuning)

一旦开始使用 SDR,您通常会在 FFT 的中心发现一个大尖峰。它被称为“直流偏移”或“直流尖峰”,有时称为“LO泄漏”,其中LO代表本地振荡器。
下面是直流尖峰的示例:
由于SDR调谐到中心频率,因此FFT的0 Hz部分对应于中心频率。话虽如此,直流尖峰并不一定意味着中心频率处有能量。如果只有一个直流尖峰,而FFT的其余部分看起来像噪声,那么很可能实际上没有信号向你显示一个。
直流偏移是直接变频接收器中的常见工件,这是用于SDR的架构,如PlutoSDR,RTL-SDR,LimeSDR和许多Ettus USRP。在直接变频接收器中,振荡器LO将信号从其实际频率下变频至基带。因此,该LO的泄漏出现在观察到的带宽的中心。LO泄漏是通过频率组合产生的额外能量。消除这种额外的噪声很困难,因为它接近所需的输出信号。许多RF集成电路(RFIC)具有内置的自动直流偏移消除功能,但通常需要存在信号才能工作。这就是为什么在没有信号的情况下直流尖峰会非常明显的原因。
处理直流失调的一种快速方法是对信号进行过采样并使其失谐。例如,假设我们想在 100 MHz 下查看 5 MHz 的频谱。相反,我们可以做的是在 20 MHz 的中心频率为 95 MHz 时采样。
上面的蓝色框显示了SDR实际采样的内容,绿色框显示了我们想要的频谱部分。我们的LO将设置为95 MHz,因为这是我们要求SDR调谐的频率。由于 95 MHz 在绿框之外,我们不会得到任何直流尖峰。
有一个问题:如果我们希望信号以 100 MHz 为中心并且只包含 5 MHz,我们将不得不自己执行频移、滤波和下采样信号(我们稍后将学习如何做)。幸运的是,这种失谐过程(即应用LO偏移)通常内置于SDR中,它们将自动执行失谐,然后将频率转移到所需的中心频率。当 SDR 可以在内部完成时,我们会受益:我们不必通过 USB 或以太网连接发送更高的采样率,这限制了我们可以使用多高的采样率。
关于直流偏移的这一小节是本教科书与其他教科书不同的一个很好的例子。您的普通DSP教科书将讨论采样,但它往往不包括诸如直流偏移之类的实现障碍,尽管它们在实践中很普遍。

计算平均功率

对于离散复数信号,即我们采样的信号,我们可以通过取每个样本的大小,对其进行平方,然后找到平均值来找到平均功率:
请记住,复数的绝对值只是量级,即

在 Python 中,计算平均功率如下所示:

avg_pwr = np.mean(np.abs(x)**2)

这是计算采样信号平均功率的一个非常有用的技巧。如果您的信号的平均值大致为零(SDR 中通常是这种情况(我们稍后会看到原因),那么可以通过取样本的方差来找到信号功率。在这些情况下,你可以在 Python 中这样计算功率:

avg_pwr = np.var(x) # (signal should have roughly zero mean)

样本的方差计算平均功率非常简单的原因:当是信号的平均值,方差方程是。这个等式看起来很熟悉!如果 为零,则确定样本方差的方程等效于功率方程。您还可以从观察窗口中的样本中减去均值,然后取方差。只要知道,如果平均值不为零,则方差和功率不相等。

计算功率谱密度(PSD)

上一章我们了解到,我们可以使用FFT将信号转换为频域,结果称为功率谱密度(PSD)。但是要真正找到一批样本的PSD并绘制它,我们所做的不仅仅是一个FFT。我们必须做以下六个操作来计算 PSD:
1、取我们样品的FFT。如果我们有 x 个样本,则默认情况下 FFT 大小将是 x 的长度。让我们以前 1024 个样本为例来创建 1024 大小的 FFT。输出将是 1024 个复浮点数。
2、以FFT输出的大小为例,它为我们提供了1024个真实的浮点数。
3、对所得幅度进行平方以获得功率。
4、归一化:除以FFT大小( N )和采样率( Fs )。
5、使用 ; 转换为 dB我们始终以对数比例查看 PSD。
6、执行上一章中介绍的FFT移位,将“0 Hz”移到中心,负频率移动到中心的左侧。
Python 中的这六个步骤是:

Fs = 1e6 # lets say we sampled at 1 MHz
# assume x contains your array of IQ samples
N = 1024
x = x[0:N] # we will only take the FFT of the first 1024 samples, see text below
PSD = np.abs(np.fft.fft(x))**2 / (N*Fs)
PSD_log = 10.0*np.log10(PSD)
PSD_shifted = np.fft.fftshift(PSD_log)

或者,我们可以应用一个窗口,就像我们在频域一章中学到的那样。窗口化将发生在带有 fft() 的代码行之前。

# add the following line after doing x = x[0:1024]
x = x * np.hamming(len(x)) # apply a Hamming window

要绘制此PSD,我们需要知道x轴的值。正如我们上一章所学到的,当我们对信号进行采样时,我们只“看到”-Fs/2和Fs/2之间的频谱,其中Fs是我们的采样率。我们在频域中实现的分辨率取决于FFT的大小,默认情况下等于我们执行FFT操作的样本数。在这种情况下,我们的 x 轴是 -0.5 MHz 和 0.5 MHz 之间的 1024 个等距点。如果我们将SDR调谐到2.4 GHz,我们的观察窗口将在2.3995 GHz和2.4005 GHz之间。在 Python 中,移动观察窗口将如下所示:

center_freq = 2.4e9 # frequency we tuned our SDR to
f = np.arange(Fs/-2.0, Fs/2.0, Fs/N) # start, stop, step.  centered around 0 Hz
f += center_freq # now add center frequency
plt.plot(f, PSD_shifted)
plt.show()

我们应该留下一个美丽的PSD!
如果你想找到数百万个样本的PSD,不要做百万点FFT,因为它可能需要很长时间。毕竟,它会给你一百万个“频率箱”的输出,这在部分中得太多了。相反,我建议做多个较小的PSD并将它们平均在一起或使用频谱图显示它们。或者,如果您知道您的信号变化不快,那么使用几千个样本并找到这些样本的 PSD 就足够了;在几千个样本的时间范围内,您可能会捕获足够的信号以获得良好的表示。
下面是一个完整的代码示例,包括生成信号(50 Hz 时的复指数)和噪声。请注意,N(要模拟的样本数)成为FFT长度,因为我们采用整个模拟信号的FFT。

import numpy as np
import matplotlib.pyplot as pltFs = 300 # sample rate
Ts = 1/Fs # sample period
N = 2048 # number of samples to simulatet = Ts*np.arange(N)
x = np.exp(1j*2*np.pi*50*t) # simulates sinusoid at 50 Hzn = (np.random.randn(N) + 1j*np.random.randn(N))/np.sqrt(2) # complex noise with unity power
noise_power = 2
r = x + n * np.sqrt(noise_power)PSD = np.abs(np.fft.fft(r))**2 / (N*Fs)
PSD_log = 10.0*np.log10(PSD)
PSD_shifted = np.fft.fftshift(PSD_log)f = np.arange(Fs/-2.0, Fs/2.0, Fs/N) # start, stop, stepplt.plot(f, PSD_shifted)
plt.xlabel("Frequency [Hz]")
plt.ylabel("Magnitude [dB]")
plt.grid(True)
plt.show()

3、IQ采样【入门软件无线电(SDR)】PySDR:使用 Python 的 SDR 和 DSP 指南相关推荐

  1. 4、PlutoSDR【入门软件无线电(SDR)】PySDR:使用 Python 的 SDR 和 DSP 指南

    因为设备不同,本教程未实测,仅作为PlutoSDR参考 在本章中,我们将学习如何将Python API用于PlutoSDR,这是ADI公司的低成本SDR.我们将介绍PlutoSDR安装步骤,以使驱动程 ...

  2. python猜年龄代码_python入门教程NO.7用python来写一个猜数字游戏

    python入门教程 本文涉及的python基础语法为while循环 #python#3中while语句常常被用于循环执行某个程序,任何非0和非空null的值,都会被条件判断为True while 条 ...

  3. python 快速排序_小白入门知识详解:Python实现快速排序的方法(含实例代码)...

    前言: 今天为大家带来的内容是:小白入门知识详解:Python实现快速排序的方法(含实例代码)希望通过本文的内容能够对各位有所帮助,喜欢的话记得点赞转发收藏不迷路哦!!! 提示: 这篇文章主要介绍了P ...

  4. python语言入门自学-如何系统地自学 Python?

    很多同学在学习完python的基本语法后,都会面临着接下来我该干什么的困境! 这是一篇非常详细的,覆盖了Python从入门到后期的全套方法论和相关资料,建议收藏后查阅. 另外我作为从本科到现在读博一直 ...

  5. python编程入门第一课_python入门前的第一课 python怎样入门

    人工智能时代的到来,很多文章说这么一句:"不会python,就不要说自己是程序员",这说的有点夸张了,但确实觉得目前python这个语言值得学习,而且会python是高薪程序员的必 ...

  6. python银行利息问题_python入门教程NO.8 用python写个存款利息计算器

    python入门教程 python入门教程NO.8 用python写个存款利息计算器 本文涉及的python基础语法为def函数,return,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好 ...

  7. 入门Python400集视频,Python学会之后,一般能拿到多少工资?

    阿里巴巴提倡必学,入门Python400集视频,Python学会之后,一般能拿到多少工资? 对于初学者想更轻松的学好Python开发,爬虫技术,Python数据分析,人工智能等技术,这里也给大家准备了 ...

  8. 【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)

    大家好,我在CSDN开的OpenCV课程已经开课了,入口如下: OpenCV入门精讲(C++/Python双语教学) 课程开始快一周了,收到了广大同学们的欢迎. (1)评分很高: (2)已经有50+同 ...

  9. Python入门(二)之Python的集成开发环境(IDE)

    点赞.关注再看,养成良好习惯 本系列视频课程详见超星学习通:https://me.chaoxing.com(点击方可链接) 欢迎博友们亲临指导 1. 引言 在博文<Python入门(一)之Pyt ...

最新文章

  1. flask_sqlalchemy 教程
  2. yum下载包保存到本地
  3. LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
  4. Robot Cleaner I
  5. Mysql系列常见面试题
  6. Research Fellow、Research Assistant、predoc等的区别
  7. Maximum Xor Secondary CodeForces - 281D (单调栈)
  8. Listener监听器与Filter过滤器
  9. PATH、cp命令、mv、文档查看命令
  10. Library弱依赖打包
  11. 【Python】爬取的图片不对怎么办?Python爬取网页图片小结
  12. 2017百度之星资格赛 1001/hdu 6080 度度熊保护村庄
  13. 网易云音乐外链播放器代码的一个bug
  14. 【nodejs】mocha+chai+nyc基础
  15. C# FileInfo类:文件操作
  16. HCSR04超声波传感器驱动
  17. 大数据及人工智能基础系列2 B+树
  18. python预测糖尿病_使用决策树与随机深林预测糖尿病(python)
  19. google aab超过150M大小如何优化上传谷歌商店
  20. 机器学习实战(6)——决策树

热门文章

  1. 摸鱼也有效率——8个python自动化脚本提高打工人幸福感~
  2. 银行测试(4)-银行贷款业务介绍
  3. ppt里面怎么打破折号
  4. EROFS——来自华为的新型只读文件系统
  5. (原)让win8开机自动进行宽带连接
  6. JAVA学习-Stream流的生成、中间操作、终结、收集操作
  7. 简述计算机三大变换的联系和区别 (傅里叶变换 拉普拉斯变换 z变换)
  8. ElasticSearcho从入门到放弃:(三)Beats
  9. GHO和ISO的区别
  10. Mac更改默认Finder访达窗口大小的方法