Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

~Bakyalakshmi

Định lý lấy mẫu:

fs≥2fm

  • Tín hiệu thời gian liên tục có thể được biểu diễn dưới dạng các mẫu và có thể được phục hồi trở lại khi lấy mẫu tần số FS & nbsp; lớn hơn hoặc bằng hai lần thành phần tần số cao nhất của tín hiệu tin nhắn.
  • Nếu điều kiện này không thỏa mãn, nó dẫn đến răng cưa.
  • Aliasing & nbsp; là một hiệu ứng & nbsp; & nbsp; khiến các tín hiệu khác nhau không thể phân biệt được khi được lấy mẫu.is an effect   that causes different signals to become indistinguishable when sampled.

Trực quan hóa bằng cách sử dụng Python:

Nhập matplotlib.pyplot dưới dạng plt #& nbsp; dánh dấu

nhập khẩu NUMPY dưới dạng NP

#Numerical Python để có được mảng các giá trị float và cho hoạt động sin

t = np.Arange (0, 2e-3, 10e-6) # x Thời gian trục

# Lấy mẫu tại FS = 10kHz trong miền thời gian TS = 1/FS (0.1ms)

ts = np.arange (0,2E-3,0.1E-3)

F = 1000 # Tín hiệu tin nhắn FM

B = np.sin (2*np.pi*f*t) #phase cho sinewave

c = np.sin (2*np.pi*f*ts)

plt.plot (t, b, trực

plt.plot (ts, c, xông K*)

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

fs> = 2fm: & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; tần số đầu vào = 1kHz & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Tần số lấy mẫu = 10kHz

f=9000

b = -np.sin (2*np.pi*f*t)

c = -np.sin (2*np.pi*f*ts)

plt.plot (t, b) # lô tín hiệu tin nhắn (9kHz)

plt.plot (ts, c, xông R+,) & nbsp; # Biểu đồ tín hiệu tin nhắn được lấy mẫu (9KHz)

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

FS

Đầu ra lấy mẫu là 1kHz và 9kHz:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Bí ẩn 1kHz và 9kHz

Phần 1: https://youtu.be/og-pn2ooqp4

3. Lấy mẫu IQIQ Sampling¶

Trong chương này, chúng tôi giới thiệu một khái niệm gọi là lấy mẫu IQ, mẫu mẫu phức tạp a.k.a.. Chúng tôi cũng bao gồm lấy mẫu Nyquist, số phức, chất mang RF, chuyển đổi và mật độ phổ công suất. Lấy mẫu IQ là hình thức lấy mẫu mà SDR thực hiện, cũng như nhiều máy thu kỹ thuật số (và máy phát). Nó có một phiên bản phức tạp hơn một chút của lấy mẫu kỹ thuật số thông thường (dự định chơi chữ), vì vậy chúng tôi sẽ làm cho nó chậm và với một số thực hành, khái niệm chắc chắn sẽ nhấp vào!

Lấy mẫu cơ bản

Trước khi nhảy vào lấy mẫu IQ, hãy để thảo luận về việc lấy mẫu thực sự có nghĩa là gì. Bạn có thể đã gặp lấy mẫu mà không nhận ra nó bằng cách ghi âm thanh bằng micrô. Micrô là một bộ chuyển đổi chuyển đổi sóng âm thành tín hiệu điện (mức điện áp). Tín hiệu điện đó được chuyển đổi bởi bộ chuyển đổi tương tự sang số (ADC), tạo ra một biểu diễn kỹ thuật số của sóng âm. Để đơn giản hóa, micrô thu được sóng âm được chuyển thành điện và lần lượt điện được chuyển thành số. ADC đóng vai trò là cầu nối giữa các miền tương tự và kỹ thuật số. SDR là tương tự đáng ngạc nhiên. Tuy nhiên, thay vì micrô, chúng sử dụng ăng -ten, mặc dù chúng cũng sử dụng ADC. Trong cả hai trường hợp, mức điện áp được lấy mẫu bằng ADC. Đối với SDR, hãy nghĩ rằng sóng radio trong các số sau đó ra.

Cho dù chúng tôi đang xử lý các tần số âm thanh hoặc vô tuyến, chúng tôi phải lấy mẫu nếu chúng tôi muốn chụp, xử lý hoặc lưu tín hiệu kỹ thuật số. Lấy mẫu có vẻ đơn giản, nhưng có rất nhiều thứ. Một cách kỹ thuật hơn để nghĩ về việc lấy mẫu tín hiệu là lấy các giá trị vào thời điểm và lưu chúng bằng kỹ thuật số. Hãy nói rằng chúng tôi có một số chức năng ngẫu nhiên, có thể đại diện cho bất cứ điều gì và đó là một chức năng liên tục mà chúng tôi muốn lấy mẫu:, which could represent anything, and it’s a continuous function that we want to sample:

Chúng tôi ghi lại giá trị của các khoảng thời gian đều đặn, được gọi là khoảng thời gian mẫu. Tần số mà chúng tôi lấy mẫu, tức là số lượng mẫu được lấy mỗi giây, chỉ đơn giản là. Chúng tôi gọi đây là tỷ lệ mẫu và nó là nghịch đảo của giai đoạn mẫu. Ví dụ: nếu chúng ta có tỷ lệ mẫu là 10 Hz, thì khoảng thời gian mẫu là 0,1 giây; Sẽ có 0,1 giây giữa mỗi mẫu. Trong thực tế, tỷ lệ mẫu của chúng tôi sẽ theo thứ tự hàng trăm kHz đến hàng chục MHz hoặc thậm chí cao hơn. Khi chúng tôi lấy mẫu tín hiệu, chúng tôi cần chú ý đến tỷ lệ mẫu, đó là một tham số rất quan trọng. at regular intervals of seconds, known as the sample period. The frequency at which we sample, i.e., the number of samples taken per second, is simply

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?
. We call this the sample rate, and its the inverse of the sample period. For example, if we have a sample rate of 10 Hz, then the sample period is 0.1 seconds; there will be 0.1 seconds between each sample. In practice our sample rates will be on the order of hundreds of kHz to tens of MHz or even higher. When we sample signals, we need to be mindful of the sample rate, it’s a very important parameter.

Cho những người thích nhìn thấy toán học; Đặt mẫu đại diện cho mẫu, thường là một số nguyên bắt đầu từ 0. Sử dụng quy ước này, quy trình lấy mẫu có thể được biểu diễn về mặt toán học như đối với các giá trị số nguyên của. Tức là, chúng tôi đánh giá tín hiệu tương tự trong các khoảng thời gian này. represent sample , usually an integer starting at 0. Using this convention, the sampling process can be represented mathematically as for integer values of . I.e., we evaluate the analog signal at these intervals of .

Lấy mẫu Nyquist

Đối với một tín hiệu nhất định, câu hỏi lớn thường là chúng ta phải lấy mẫu nhanh như thế nào? Hãy để kiểm tra một tín hiệu chỉ là một sóng hình sin, tần số F, được hiển thị trong màu xanh lá cây bên dưới. Hãy nói rằng chúng tôi lấy mẫu với tốc độ FS (các mẫu được hiển thị màu xanh lam). Nếu chúng ta lấy mẫu tín hiệu đó với tốc độ bằng F (tức là, FS = F), chúng ta sẽ nhận được một cái gì đó trông giống như:

Đường đứt nét màu đỏ trong hình ảnh trên tái tạo một hàm khác (không chính xác) có thể dẫn đến cùng một mẫu được ghi lại. Nó chỉ ra rằng tỷ lệ mẫu của chúng tôi quá thấp vì các mẫu tương tự có thể đến từ hai chức năng khác nhau, dẫn đến sự mơ hồ. Nếu chúng ta muốn xây dựng lại chính xác tín hiệu gốc, chúng ta có thể có sự mơ hồ này.

Hãy thử lấy mẫu nhanh hơn một chút, tại FS = 1.2F:

Một lần nữa, có một tín hiệu khác có thể phù hợp với các mẫu này. Sự mơ hồ này có nghĩa là nếu ai đó đã cho chúng tôi danh sách các mẫu này, chúng tôi không thể phân biệt tín hiệu nào là bản gốc dựa trên việc lấy mẫu của chúng tôi.

Làm thế nào về việc lấy mẫu tại FS = 1.5F:

Vẫn chưa đủ nhanh! Theo một phần của lý thuyết DSP mà chúng tôi đã giành được lặn vào, bạn phải lấy mẫu với tần số gấp đôi để loại bỏ sự mơ hồ mà chúng tôi đang trải qua:twice the frequency of the signal in order to remove the ambiguity we are experiencing:

Lần này, không có tín hiệu không chính xác nào vì chúng tôi đã lấy mẫu đủ nhanh để không có tín hiệu nào phù hợp với các mẫu này ngoài mẫu bạn nhìn thấy (trừ khi bạn tăng tần số cao hơn, nhưng chúng tôi sẽ thảo luận về điều đó sau).

Trong ví dụ trên, tín hiệu của chúng tôi chỉ là một sóng hình sin đơn giản, hầu hết các tín hiệu thực tế sẽ có nhiều thành phần tần số cho chúng. Để lấy mẫu chính xác bất kỳ tín hiệu đã cho, tốc độ mẫu phải là ít nhất gấp đôi tần số của thành phần tần số tối đa. Ở đây, một hình ảnh trực quan bằng cách sử dụng một biểu đồ miền tần số ví dụ, lưu ý rằng sẽ luôn có một sàn nhiễu nên tần số cao nhất thường là một xấp xỉ:

Chúng tôi phải xác định thành phần tần số cao nhất, sau đó nhân đôi nó và đảm bảo chúng tôi lấy mẫu ở tốc độ đó hoặc nhanh hơn. Tỷ lệ tối thiểu mà chúng ta có thể lấy mẫu được gọi là tỷ lệ Nyquist. Nói cách khác, tỷ lệ Nyquist là tốc độ tối thiểu mà tín hiệu (băng thông hữu hạn) cần được lấy mẫu để giữ lại tất cả thông tin của nó. Đó là một phần cực kỳ quan trọng của lý thuyết trong DSP và SDR đóng vai trò là cầu nối giữa các tín hiệu liên tục và riêng biệt.

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Nếu chúng tôi không lấy mẫu đủ nhanh, chúng tôi sẽ nhận được một cái gì đó gọi là bí danh, mà chúng tôi sẽ tìm hiểu về sau, nhưng chúng tôi cố gắng tránh nó bằng mọi giá. Những gì SDR của chúng tôi làm (và hầu hết các máy thu nói chung) là lọc mọi thứ trên FS/2 ngay trước khi lấy mẫu được thực hiện. Nếu chúng ta cố gắng nhận tín hiệu với tốc độ mẫu quá thấp, bộ lọc đó sẽ cắt bỏ một phần của tín hiệu. Các SDR của chúng tôi đi rất lâu để cung cấp cho chúng tôi các mẫu không có bí danh và các không hoàn hảo khác.

Lấy mẫu qua hai

Thuật ngữ Quadrature, có nhiều ý nghĩa, nhưng trong bối cảnh DSP và SDR, nó đề cập đến hai sóng vượt quá 90 độ. Tại sao 90 độ hết giai đoạn? Hãy xem xét làm thế nào hai sóng nằm ngoài pha 180 độ về cơ bản là cùng một sóng với một sóng nhân với -1. Bằng cách mất 90 độ, chúng trở nên trực giao, và có rất nhiều thứ thú vị mà bạn có thể làm với các chức năng trực giao. Để đơn giản, chúng tôi sử dụng hình sin và cosin làm hai sóng hình sin của chúng tôi ngoài pha 90 độ.

Tiếp theo, hãy để các biến gán các biến để biểu thị biên độ của sin và cosin. Chúng tôi sẽ sử dụng cho cos () và cho sin ():amplitude of the sine and cosine. We will use for the cos() and for the sin():

Chúng ta có thể thấy điều này một cách trực quan bằng cách vẽ i và q bằng 1:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Chúng tôi gọi cos () là thành phần của pha trong giai đoạn, do đó tên I và sin () là 90 độ của thành phần hoặc phần hai góc cos () và tôi với tội lỗi (), nó sẽ không tạo ra sự khác biệt cho hầu hết các tình huống.

Lấy mẫu IQ dễ hiểu hơn bằng cách sử dụng quan điểm của máy phát, tức là, xem xét nhiệm vụ truyền tín hiệu RF qua không khí. Những gì chúng tôi làm khi máy phát là thêm sin () và cos (). Hãy để nói x (t) là tín hiệu của chúng tôi để truyền:

Điều gì xảy ra khi chúng ta thêm một sin và cosin? Hay đúng hơn, điều gì xảy ra khi chúng ta thêm hai hình sin ngoài pha 90 độ? Trong video dưới đây, có một thanh trượt để điều chỉnh I và một thanh khác để điều chỉnh Q. Những gì được vẽ là cosin, sin, và sau đó là tổng của cả hai.

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

(Mã được sử dụng cho ứng dụng Python dựa trên pyqtgraph này có thể được tìm thấy ở đây)

Cái nhìn quan trọng là khi chúng ta thêm cos () và sin (), chúng ta sẽ có một sóng hình sin tinh khiết khác với một pha và biên độ khác nhau. Ngoài ra, sự thay đổi pha khi chúng tôi từ từ loại bỏ hoặc thêm một trong hai phần. Biên độ cũng thay đổi. Đây là tất cả kết quả của danh tính Trig:, mà chúng ta sẽ quay lại một chút. Tiện ích của người Viking, hành vi này là chúng ta có thể kiểm soát pha và biên độ của sóng hình sin kết quả bằng cách điều chỉnh biên độ I và Q (chúng ta không phải điều chỉnh pha của cosin hoặc sin). Ví dụ, chúng ta có thể điều chỉnh I và Q theo cách giữ cho biên độ không đổi và làm cho pha bất cứ điều gì chúng ta muốn. Là một máy phát, khả năng này cực kỳ hữu ích vì chúng ta biết rằng chúng ta cần truyền tín hiệu hình sin để nó bay trong không khí như một sóng điện từ. Và nó dễ dàng hơn nhiều để điều chỉnh hai biên độ và thực hiện một thao tác bổ sung so với điều chỉnh biên độ và pha. Kết quả là máy phát của chúng tôi sẽ trông giống như thế này:, which we will come back to in a bit. The “utility” of this behavior is that we can control the phase and amplitude of a resulting sine wave by adjusting the amplitudes I and Q (we don’t have to adjust the phase of the cosine or sine). For example, we could adjust I and Q in a way that keeps the amplitude constant and makes the phase whatever we want. As a transmitter this ability is extremely useful because we know that we need to transmit a sinusoidal signal in order for it to fly through the air as an electromagnetic wave. And it’s much easier to adjust two amplitudes and perform an addition operation compared to adjusting an amplitude and a phase. The result is that our transmitter will look something like this:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Chúng ta chỉ cần tạo ra một sóng hình sin và thay đổi 90 độ để có được phần Q.

Số phức¶

Cuối cùng, quy ước IQ là một cách khác để thể hiện độ lớn và pha, dẫn chúng ta đến các số phức tạp và khả năng thể hiện chúng trên một mặt phẳng phức tạp. Bạn có thể đã thấy những con số phức tạp trước đây trong các lớp khác. Lấy số phức 0,7-0,4J làm ví dụ:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Một con số phức tạp thực sự chỉ là hai số cùng nhau, một phần thực và một phần tưởng tượng. Một số phức tạp cũng có độ lớn và pha, điều này có ý nghĩa hơn nếu bạn nghĩ về nó như một vectơ thay vì một điểm. Độ lớn là chiều dài của đường giữa gốc và điểm (nghĩa là chiều dài của vectơ), trong khi pha là góc giữa vectơ và 0 độ, chúng ta định nghĩa là trục thực dương dương:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Đại diện này của một hình sin được biết đến như một sơ đồ Phasor. Nó chỉ đơn giản là vẽ những con số phức tạp và coi chúng là vectơ. Bây giờ độ lớn và pha của phức hợp ví dụ số 0,7-0,4J của chúng tôi là gì? Đối với một số phức nhất là phần thực và là phần tưởng tượng: is the real part and is the imaginary part:

Trong Python, bạn có thể sử dụng np.abs (x) và np.angle (x) cho độ lớn và pha. Đầu vào có thể là một số phức hoặc một mảng các số phức và đầu ra sẽ là một số thực (các) số lượng (của của loại dữ liệu nổi).real number(s) (of the data type float).

Bây giờ bạn có thể đã tìm ra cách vectơ hoặc sơ đồ phasor này liên quan đến quy ước IQ: Tôi là thật và Q là tưởng tượng. Từ thời điểm này, khi chúng tôi vẽ mặt phẳng phức tạp, chúng tôi sẽ dán nhãn nó với I và Q thay vì thực và tưởng tượng. Họ vẫn là những con số phức tạp!

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Bây giờ, hãy để nói rằng chúng tôi muốn truyền điểm ví dụ của chúng tôi 0,7-0,4J. Chúng tôi sẽ truyền tải:

Chúng ta có thể sử dụng danh tính Trig nơi độ lớn của chúng ta được tìm thấy và là pha của chúng ta, bằng. Phương trình trên bây giờ trở thành: where is our magnitude found with and is our phase, equal to . The above equation now becomes:

Mặc dù chúng tôi bắt đầu với một số lượng phức tạp, những gì chúng tôi đang truyền là có thật, điều này rất tốt bởi vì bạn có thể thực sự truyền một cái gì đó tưởng tượng với sóng điện từ. Chúng tôi chỉ sử dụng các số tưởng tượng/phức tạp để thể hiện những gì chúng tôi đang truyền. Chúng tôi sẽ nói về thời gian ngắn. shortly.

Các số phức tạp trong FFTS¶

Các số phức tạp ở trên được coi là các mẫu miền thời gian, nhưng bạn cũng sẽ chạy vào các số phức khi bạn lấy FFT. Khi chúng tôi bao gồm Fourier Series và FFTS chương cuối cùng, chúng tôi đã không nhập vào những con số phức tạp. Khi bạn lấy FFT của một loạt các mẫu, nó sẽ tìm thấy biểu diễn miền tần số. Chúng tôi đã nói về cách các hình FFT ra khỏi tần số tồn tại trong tập hợp các mẫu đó (độ lớn của FFT cho thấy cường độ của mỗi tần số). Nhưng những gì FFT cũng làm là tìm ra độ trễ (dịch chuyển thời gian) cần thiết để áp dụng cho từng tần số đó, để tập hợp các hình sin có thể được thêm vào để tái tạo tín hiệu miền thời gian. Sự chậm trễ đó chỉ đơn giản là giai đoạn của FFT. Đầu ra của FFT là một mảng các số phức và mỗi số phức cho bạn độ lớn và pha, và chỉ số của số đó cung cấp cho bạn tần số. Nếu bạn tạo ra các hình sin ở các tần số/cường độ/pha đó và tổng hợp chúng lại với nhau, bạn sẽ nhận được tín hiệu miền thời gian ban đầu của mình (hoặc một cái gì đó rất gần với nó, và đó là nơi mà định lý lấy mẫu Nyquist phát huy tác dụng).

Người nhận bên

Bây giờ, hãy để Lừa có quan điểm của một máy thu radio đang cố gắng nhận tín hiệu (ví dụ: tín hiệu vô tuyến FM). Sử dụng lấy mẫu IQ, sơ đồ bây giờ trông giống như:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Những gì xuất hiện là một tín hiệu thực nhận được bởi ăng -ten của chúng tôi và chúng được chuyển thành các giá trị IQ. Những gì chúng tôi làm là lấy mẫu các nhánh I và Q riêng lẻ, sử dụng hai ADC, sau đó chúng tôi kết hợp các cặp và lưu trữ chúng dưới dạng các số phức tạp. Nói cách khác, tại mỗi bước thời gian, bạn sẽ lấy mẫu một giá trị I và một giá trị Q và kết hợp chúng trong biểu mẫu (tức là, một số phức trên mỗi mẫu IQ). Sẽ luôn có một tỷ lệ mẫu của người Viking, tốc độ lấy mẫu được thực hiện. Ai đó có thể nói, tôi có một SDR chạy ở tốc độ mẫu 2 MHz. Ý nghĩa của chúng là SDR nhận được hai triệu mẫu IQ mỗi giây. (i.e., one complex number per IQ sample). There will always be a “sample rate”, the rate at which sampling is performed. Someone might say, “I have an SDR running at 2 MHz sample rate.” What they mean is that the SDR receives two million IQ samples per second.

Nếu ai đó cung cấp cho bạn một loạt các mẫu IQ, nó sẽ trông giống như một mảng/vectơ 1D của các số phức tạp. Điểm này, phức tạp hay không, là những gì toàn bộ chương này đã được xây dựng, và cuối cùng chúng tôi đã thực hiện nó.

Trong suốt sách giáo khoa này, bạn sẽ trở nên rất quen thuộc với cách các mẫu IQ hoạt động, cách nhận và truyền chúng bằng SDR, cách xử lý chúng trong Python và cách lưu chúng vào một tệp để phân tích sau.very familiar with how IQ samples work, how to receive and transmit them with an SDR, how to process them in Python, and how to save them to a file for later analysis.

Một lưu ý quan trọng cuối cùng: Hình trên cho thấy những gì xảy ra bên trong SDR. Chúng tôi thực sự phải tạo ra một sóng hình sin, thay đổi 90, nhân hoặc thêm vào đó, SDR làm điều đó cho chúng tôi. Chúng tôi cho SDR biết tần suất chúng tôi muốn lấy mẫu hoặc tần số chúng tôi muốn truyền các mẫu của chúng tôi tại. Về phía người nhận, SDR sẽ cung cấp cho chúng tôi các mẫu IQ. Đối với phía truyền, chúng tôi phải cung cấp SDR các mẫu IQ. Về kiểu dữ liệu, chúng sẽ là INT hoặc nổi phức tạp.inside of the SDR. We don’t actually have to generate a sine wave, shift by 90, multiply or add–the SDR does that for us. We tell the SDR what frequency we want to sample at, or what frequency we want to transmit our samples at. On the receiver side, the SDR will provide us the IQ samples. For the transmitting side, we have to provide the SDR the IQ samples. In terms of data type, they will either be complex ints or floats.

Người vận chuyển và hạ cấp

Cho đến thời điểm này, chúng tôi đã không thảo luận về tần số, nhưng chúng tôi đã thấy có một phương trình liên quan đến cos () và sin (). Tần số này là tần số của sóng hình sin mà chúng tôi thực sự gửi qua không khí (tần số sóng điện từ). Chúng tôi gọi nó là người vận chuyển trên mạng vì nó mang thông tin của chúng tôi về một tần số nhất định. Khi chúng tôi điều chỉnh một tần số với SDR của chúng tôi và nhận mẫu, thông tin của chúng tôi được lưu trữ trong I và Q; Nhà cung cấp này không hiển thị trong I và Q, giả sử chúng tôi đã điều chỉnh cho nhà cung cấp dịch vụ. in the equations involving the cos() and sin(). This frequency is the frequency of the sine wave we actually send through the air (the electromagnetic wave’s frequency). We refer to it as the “carrier” because it carries our information on a certain frequency. When we tune to a frequency with our SDR and receive samples, our information is stored in I and Q; this carrier does not show up in I and Q, assuming we tuned to the carrier.

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Để tham khảo, các tín hiệu vô tuyến như đài FM, WiFi, Bluetooth, LTE, GPS, v.v., thường sử dụng tần số (tức là, một chất mang) trong khoảng 100 MHz đến 6 GHz. Các tần số này truyền đi rất tốt trong không khí, nhưng chúng không yêu cầu ăng -ten siêu dài hoặc một tấn năng lượng để truyền hoặc nhận. Lò vi sóng của bạn nấu thức ăn với sóng điện từ ở 2,4 GHz. Nếu có rò rỉ ở cửa thì lò vi sóng của bạn sẽ làm mứt tín hiệu WiFi và cũng có thể đốt cháy da của bạn. Một dạng khác của sóng điện từ là ánh sáng. Ánh sáng nhìn thấy có tần số khoảng 500 THz. Nó rất cao đến nỗi chúng tôi không sử dụng ăng -ten truyền thống để truyền ánh sáng. Chúng tôi sử dụng các phương thức như đèn LED là thiết bị bán dẫn. Chúng tạo ra ánh sáng khi các electron nhảy vào giữa các quỹ đạo nguyên tử của vật liệu bán dẫn và màu sắc phụ thuộc vào khoảng cách chúng nhảy. Về mặt kỹ thuật, tần số vô tuyến (RF) được định nghĩa là phạm vi từ khoảng 20 kHz đến 300 GHz. Đây là những tần số năng lượng từ dòng điện dao động có thể tỏa ra một dây dẫn (ăng -ten) và di chuyển trong không gian. Phạm vi 100 MHz đến 6 GHz là tần số hữu ích hơn, ít nhất là đối với hầu hết các ứng dụng hiện đại. Các tần số trên 6 GHz đã được sử dụng cho liên lạc radar và vệ tinh trong nhiều thập kỷ, và hiện đang được sử dụng trong 5G tựa MMWave (24 - 29 GHz) để bổ sung các dải thấp hơn và tăng tốc độ.

Khi chúng tôi thay đổi giá trị IQ của mình một cách nhanh chóng và truyền tải người mang của chúng tôi, nó được gọi là điều chỉnh của người dùng (với dữ liệu hoặc bất cứ điều gì chúng tôi muốn). Khi chúng tôi thay đổi I và Q, chúng tôi thay đổi pha và biên độ của sóng mang. Một tùy chọn khác là thay đổi tần số của sóng mang, tức là, dịch chuyển nó lên hoặc xuống một chút, đó là những gì FM Radio làm.

Ví dụ đơn giản, hãy để nói rằng chúng tôi truyền mẫu IQ 1+0J, sau đó chúng tôi chuyển sang truyền 0+1J. Chúng tôi đi từ việc gửi đến, có nghĩa là nhà cung cấp dịch chuyển của chúng tôi chuyển pha 90 độ khi chúng tôi chuyển từ mẫu này sang mẫu khác. to , meaning our carrier shifts phase by 90 degrees when we switch from one sample to another.

Bây giờ trở lại lấy mẫu trong một giây. Thay vì nhận các mẫu bằng cách nhân những gì phát ra ăng -ten với một cos () và sin () sau đó ghi I và Q, nếu chúng ta đưa tín hiệu từ ăng -ten vào một ADC duy nhất, như trong kiến ​​trúc lấy mẫu trực tiếp mà chúng ta vừa thảo luận? Giả sử tần số sóng mang là 2,4 GHz, như WiFi hoặc Bluetooth. Điều đó có nghĩa là chúng tôi sẽ phải lấy mẫu ở 4,8 GHz, như chúng tôi đã học. Điều đó cực kỳ nhanh! Một ADC lấy mẫu nhanh hàng ngàn đô la. Thay vào đó, chúng tôi, Downconvert, tín hiệu để tín hiệu chúng tôi muốn lấy mẫu được tập trung vào DC hoặc 0 Hz. Sự xuống xe này xảy ra trước khi chúng tôi lấy mẫu. Chúng tôi đi từ:

chỉ tôi và Q.

Hãy để trực quan hóa DownConversion trong miền tần số:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Khi chúng tôi tập trung vào khoảng 0 Hz, tần số tối đa không còn 2,4 GHz mà dựa trên các đặc điểm của tín hiệu vì chúng tôi đã loại bỏ sóng mang. Hầu hết các tín hiệu đều rộng khoảng 100 kHz đến 40 MHz trong băng thông, vì vậy thông qua việc chuyển đổi xuống, chúng tôi có thể lấy mẫu với tốc độ thấp hơn nhiều. Cả B2X0 USRPS và Plutosdr đều chứa mạch tích hợp RF (RFIC) có thể lấy mẫu lên tới 56 MHz, đủ cao cho hầu hết các tín hiệu mà chúng ta sẽ gặp.

Chỉ cần nhắc lại, quá trình chuyển đổi xuống được thực hiện bởi SDR của chúng tôi; Là người dùng của SDR, chúng tôi không phải làm bất cứ điều gì khác ngoài việc nói với nó tần suất điều chỉnh. DownConversion (và Upconversion) được thực hiện bởi một thành phần gọi là máy trộn, thường được biểu diễn trong các sơ đồ dưới dạng ký hiệu nhân bên trong một vòng tròn. Bộ trộn lấy tín hiệu, xuất tín hiệu xuống/chuyển đổi và có cổng thứ ba được sử dụng để cung cấp trong bộ tạo dao động. Tần số của bộ dao động xác định dịch chuyển tần số được áp dụng cho tín hiệu và bộ trộn về cơ bản chỉ là một hàm nhân (nhớ lại rằng nhân với hình sin gây ra sự thay đổi tần số).

Cuối cùng, bạn có thể tò mò làm thế nào các tín hiệu nhanh trong không khí. Nhớ lại từ lớp vật lý trung học rằng sóng vô tuyến chỉ là sóng điện từ ở tần số thấp (từ khoảng 3 kHz đến 80 GHz). Ánh sáng nhìn thấy cũng là sóng điện từ, ở tần số cao hơn nhiều (400 THz đến 700 THz). Tất cả các sóng điện từ di chuyển với tốc độ ánh sáng, khoảng 3e8 m/s, ít nhất là khi đi qua không khí hoặc chân không. Bây giờ vì chúng luôn di chuyển với cùng tốc độ, khoảng cách mà sóng di chuyển trong một dao động đầy đủ (một chu kỳ đầy đủ của sóng hình sin) phụ thuộc vào tần số của nó. Chúng tôi gọi khoảng cách này là bước sóng, được ký hiệu là. Bạn có thể đã thấy mối quan hệ này trước đây:. You have probably seen this relationship before:

where is the speed of light, typically set to 3e8 when is in Hz and is in meters. In wireless communications this relationship becomes important when we get to antennas, because to receive a signal at a certain carrier frequency, , you need an antenna that matches its wavelength, , usually the antenna is or in length. However, regardless of the frequency/wavelength, information carried in that signal will always travel at the speed of light, from the transmitter to the receiver. When calculating this delay through the air, a rule of thumb is that light travels approximately one foot in one nanosecond. Another rule of thumb: a signal traveling to a satellite in geostationary orbit and back will take roughly 0.25 seconds for the entire trip.

Receiver Architectures¶

The figure in the “Receiver Side” section demonstrates how the input signal is downconverted and split into I and Q. This arrangement is called “direct conversion”, or “zero IF”, because the RF frequencies are being directly converted down to baseband. Another option is to not downconvert at all and sample so fast to capture everything from 0 Hz to 1/2 the sample rate. This strategy is called “direct sampling” or “direct RF”, and it requires an extremely expensive ADC chip. A third architecture, one that is popular because it’s how old radios worked, is known as “superheterodyne”. It involves downconversion but not all the way to 0 Hz. It places the signal of interest at an intermediate frequency, known as “IF”. A low-noise amplifier (LNA) is simply an amplifier designed for extremely low power signals at the input. Here are the block diagrams of these three architectures, note that variations and hybrids of these architectures also exist:

Baseband and Bandpass Signals¶

We refer to a signal centered around 0 Hz as being at “baseband”. Conversely, “bandpass” refers to when a signal exists at some RF frequency nowhere near 0 Hz, that has been shifted up for the purpose of wireless transmission. There is no notion of a “baseband transmission”, because you can’t transmit something imaginary. A signal at baseband may be perfectly centered at 0 Hz like the right-hand portion of the figure in the previous section. It might be near 0 Hz, like the two signals shown below. Those two signals are still considered baseband. Also shown is an example bandpass signal, centered at a very high frequency denoted .

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

You may also hear the term intermediate frequency (abbreviated as IF); for now, think of IF as an intermediate conversion step within a radio between baseband and bandpass/RF.

We tend to create, record, or analyze signals at baseband because we can work at a lower sample rate (for reasons discussed in the previous subsection). It is important to note that baseband signals are often complex signals, while signals at bandpass (e.g., signals we actually transmit over RF) are real. Think about it: because the signal fed through an antenna must be real, you cannot directly transmit a complex/imaginary signal. You will know a signal is definitely a complex signal if the negative frequency and positive frequency portions of the signal are not exactly the same. Complex numbers are how we represent negative frequencies after all. In reality there are no negative frequencies; it’s just the portion of the signal below the carrier frequency.

In the earlier section where we played around with the complex point 0.7 - 0.4j, that was essentially one sample in a baseband signal. Most of the time you see complex samples (IQ samples), you are at baseband. Signals are rarely represented or stored digitally at RF, because of the amount of data it would take, and the fact we are usually only interested in a small portion of the RF spectrum.

DC Spike and Offset Tuning¶

Once you start working with SDRs, you will often find a large spike in the center of the FFT. It is called a “DC offset” or “DC spike” or sometimes “LO leakage”, where LO stands for local oscillator.

Here’s an example of a DC spike:

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Because the SDR tunes to a center frequency, the 0 Hz portion of the FFT corresponds to the center frequency. That being said, a DC spike doesn’t necessarily mean there is energy at the center frequency. If there is only a DC spike, and the rest of the FFT looks like noise, there is most likely not actually a signal present where it is showing you one.

A DC offset is a common artifact in direct conversion receivers, which is the architecture used for SDRs like the PlutoSDR, RTL-SDR, LimeSDR, and many Ettus USRPs. In direct conversion receivers, an oscillator, the LO, downconverts the signal from its actual frequency to baseband. As a result, leakage from this LO appears in the center of the observed bandwidth. LO leakage is additional energy created through the combination of frequencies. Removing this extra noise is difficult because it is close to the desired output signal. Many RF integrated circuits (RFICs) have built-in automatic DC offset removal, but it typically requires a signal to be present to work. That is why the DC spike will be very apparent when no signals are present.

Một cách nhanh chóng để xử lý độ lệch DC là làm mẫu tín hiệu và điều chỉnh nó. Ví dụ, hãy để nói rằng chúng tôi muốn xem 5 MHz phổ ở 100 MHz. Thay vào đó, những gì chúng ta có thể làm là mẫu ở 20 MHz ở tần số trung tâm là 95 MHz.

Hướng dẫn how do you use signal sampling in python? - làm thế nào để bạn sử dụng lấy mẫu tín hiệu trong python?

Hộp màu xanh ở trên cho thấy những gì thực sự được lấy mẫu bởi SDR và ​​hộp màu xanh lá cây hiển thị phần phổ chúng tôi muốn. LO của chúng tôi sẽ được đặt thành 95 MHz vì đó là tần số mà chúng tôi yêu cầu SDR điều chỉnh. Vì 95 MHz nằm ngoài hộp màu xanh lá cây, chúng tôi đã giành được bất kỳ DC Spike nào.

Có một vấn đề: Nếu chúng tôi muốn tín hiệu của chúng tôi được tập trung ở mức 100 MHz và chỉ chứa 5 MHz, chúng tôi sẽ phải thực hiện thay đổi tần số, lọc và lấy mẫu tín hiệu (điều chúng tôi sẽ học cách làm sau). May mắn thay, quá trình tắt này, a.k.a áp dụng một phần bù LO, thường được tích hợp vào SDR, nơi chúng sẽ tự động thực hiện tắt và sau đó chuyển tần số sang tần số trung tâm mong muốn của bạn. Chúng tôi được hưởng lợi khi SDR có thể làm điều đó trong nội bộ: chúng tôi không phải gửi tỷ lệ mẫu cao hơn so với kết nối USB hoặc Ethernet của chúng tôi, điều này đã tắc nghẽn tốc độ mẫu chúng tôi có thể sử dụng cao như thế nào.

Tiểu mục này liên quan đến việc bù đắp DC là một ví dụ điển hình về nơi sách giáo khoa này khác với những người khác. Sách giáo khoa DSP trung bình của bạn sẽ thảo luận về việc lấy mẫu, nhưng nó có xu hướng không bao gồm các rào cản thực hiện như bù đắp DC mặc dù tỷ lệ lưu hành trong thực tế.

Tính toán sức mạnh trung bình

Đối với một tín hiệu phức tạp rời rạc, tức là, một tín hiệu chúng ta đã lấy mẫu, chúng ta có thể tìm thấy sức mạnh trung bình bằng cách lấy độ lớn của từng mẫu, bình phương và sau đó tìm thấy giá trị trung bình:

Hãy nhớ rằng giá trị tuyệt đối của một số phức chỉ là độ lớn, tức là,

Trong Python, việc tính toán công suất trung bình sẽ trông giống như:

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

Dưới đây là một mẹo rất hữu ích để tính toán công suất trung bình của tín hiệu được lấy mẫu. Nếu tín hiệu của bạn có giá trị trung bình bằng 0, thường là trường hợp trong SDR (chúng ta sẽ thấy lý do tại sao sau này), đó có thể tìm thấy công suất tín hiệu bằng cách lấy phương sai của các mẫu. Trong những trường hợp này, bạn có thể tính toán sức mạnh theo cách này trong Python:

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

Lý do tại sao phương sai của các mẫu tính toán công suất trung bình khá đơn giản: phương trình cho phương sai là nơi có nghĩa là tín hiệu. Phương trình đó trông quen thuộc! Nếu bằng 0 thì phương trình để xác định phương sai của các mẫu trở nên tương đương với phương trình cho công suất. Bạn cũng có thể trừ đi giá trị trung bình từ các mẫu trong cửa sổ quan sát của bạn, sau đó lấy phương sai. Chỉ cần biết rằng nếu giá trị trung bình không bằng không, phương sai và công suất không bằng nhau. where is the signal’s mean. That equation looks familiar! If is zero then the equation to determine variance of the samples becomes equivalent to the equation for power. You can also subtract out the mean from the samples in your window of observation, then take variance. Just know that if the mean value is not zero, the variance and the power are not equal.

Tính toán mật độ phổ công suất

Chương trước chúng tôi đã học được rằng chúng tôi có thể chuyển đổi tín hiệu thành miền tần số bằng FFT và kết quả được gọi là mật độ phổ công suất (PSD). Nhưng để thực sự tìm thấy PSD của một loạt các mẫu và vẽ nó, chúng tôi làm nhiều hơn là chỉ lấy FFT. Chúng ta phải thực hiện sáu hoạt động sau để tính toán PSD:

  1. Lấy FFT của các mẫu của chúng tôi. Nếu chúng ta có các mẫu X, kích thước FFT sẽ là chiều dài của X theo mặc định. Hãy để sử dụng 1024 mẫu đầu tiên làm ví dụ để tạo FFT kích thước 1024. Đầu ra sẽ là 1024 phao phức tạp.
  2. Lấy độ lớn của đầu ra FFT, cung cấp cho chúng ta 1024 phao thực.
  3. Bình thường hóa: Chia cho kích thước FFT (hoặc 1024 trong trường hợp này)., or 1024 in this case).
  4. Hình vuông độ lớn kết quả để có được sức mạnh.
  5. Chuyển đổi sang DB bằng cách sử dụng; Chúng tôi luôn xem PSD theo quy mô nhật ký.; we always view PSDs in log scale.
  6. Thực hiện một sự thay đổi FFT, được bao phủ trong chương trước, để di chuyển 0 Hz Hz ở trung tâm và tần số âm ở bên trái của trung tâm.

Sáu bước trong Python là:

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))/N)**2
PSD_log = 10.0*np.log10(PSD)
PSD_shifted = np.fft.fftshift(PSD_log)

Tùy chọn chúng ta có thể áp dụng một cửa sổ, giống như chúng ta đã học trong chương miền tần số. Hơi gió sẽ xảy ra ngay trước dòng mã với fft ().Frequency Domain chapter. Windowing would occur right before the line of code with fft().

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

Để vẽ PSD này, chúng ta cần biết các giá trị của trục x. Như chúng tôi đã học chương trước, khi chúng tôi lấy mẫu tín hiệu, chúng tôi chỉ nhìn thấy quang phổ giữa -FS/2 và FS/2 trong đó FS là tỷ lệ mẫu của chúng tôi. Độ phân giải chúng tôi đạt được trong miền tần số phụ thuộc vào kích thước FFT của chúng tôi, theo mặc định bằng số lượng mẫu mà chúng tôi thực hiện hoạt động FFT. Trong trường hợp này, trục X của chúng tôi là 1024 điểm cách đều nhau trong khoảng -0,5 MHz và 0,5 MHz. Nếu chúng tôi đã điều chỉnh SDR của chúng tôi thành 2,4 GHz, cửa sổ quan sát của chúng tôi sẽ nằm trong khoảng từ 2,3995 GHz đến 2,4005 GHz. Trong Python, việc thay đổi cửa sổ quan sát sẽ trông giống như:

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()

Chúng ta nên được để lại với một PSD đẹp!

Nếu bạn muốn tìm PSD của hàng triệu mẫu, thì hãy làm FFT hàng triệu điểm vì nó có thể sẽ mất mãi mãi. Rốt cuộc, nó sẽ cung cấp cho bạn một đầu ra của một triệu thùng tần số, sau tất cả, là quá nhiều để hiển thị trong một cốt truyện. Thay vào đó, tôi khuyên bạn nên thực hiện nhiều PSD nhỏ hơn và lấy trung bình chúng lại với nhau hoặc hiển thị chúng bằng cách sử dụng biểu đồ phổ. Ngoài ra, nếu bạn biết tín hiệu của bạn không thay đổi nhanh, thì việc sử dụng một vài nghìn mẫu và tìm PSD của chúng; Trong khung thời gian đó của một vài nghìn mẫu, bạn có thể sẽ thu được đủ tín hiệu để có được một đại diện tốt đẹp.

Dưới đây là một ví dụ đầy đủ mã bao gồm tạo tín hiệu (hàm mũ phức tạp ở 50 Hz) và nhiễu. Lưu ý rằng N, số lượng mẫu để mô phỏng, trở thành chiều dài FFT vì chúng tôi lấy FFT của toàn bộ tín hiệu mô phỏng.

import numpy as np
import matplotlib.pyplot as plt

Fs = 300 # sample rate
Ts = 1/Fs # sample period
N = 2048 # number of samples to simulate

t = Ts*np.arange(N)
x = np.exp(1j*2*np.pi*50*t) # simulates sinusoid at 50 Hz

n = (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))/N)**2
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, step

plt.plot(f, PSD_shifted)
plt.xlabel("Frequency [Hz]")
plt.ylabel("Magnitude [dB]")
plt.grid(True)
plt.show()

Output:

Làm thế nào để bạn sử dụng lấy mẫu trong tín hiệu?

Lấy mẫu tín hiệu thời gian liên tục tạo ra tín hiệu thời gian riêng biệt bằng cách chọn các giá trị của tín hiệu thời gian liên tục tại các điểm cách đều nhau. Do đó, việc lấy mẫu tín hiệu thời gian liên tục X với thời gian lấy mẫu TS cho tín hiệu thời gian riêng biệt XS được xác định bởi xs (n) = x (nts).selecting the values of the continuous time signal at evenly spaced points in time. Thus, sampling a continuous time signal x with sampling period Ts gives the discrete time signal xs defined by xs(n)=x(nTs).

Làm thế nào để bạn tìm thấy tốc độ mẫu của tín hiệu trong Python?

Tần số lấy mẫu lớn hơn hai lần tần số tối đa (FS> 5FMAX - 100Hz) F = 20 # Hz T = NP.không gian linsp (0, 0,5, 200) x1 = np.tội lỗi (2 * np.f = 20 # Hz t = np. linspace(0, 0.5, 200) x1 = np. sin(2 * np.

Làm thế nào để bạn xử lý một tín hiệu trong Python?

Xử lý tín hiệu trong Python..
Nhập matplotlib.pyplot dưới dạng nhập khẩu NUMPY dưới dạng NP từ scipy.io nhập wavfile %matplotlib nội tuyến.Một số phép thuật để xem đồ thị chất lượng tốt hơn ..
plt.rcparams ['Hình.dpi'] = 100 plt.....
Sampfreq, Sound = Wavfile.....
(dtype ('int16'), 44100) ....
Âm thanh = Âm thanh / 2.0 ** 15.....
(45568, 2) ....
1.0332879818594105..

Python có được sử dụng để xử lý tín hiệu không?

Một trong những ưu điểm chính của Python là các gói có thể được sử dụng để mở rộng ngôn ngữ để cung cấp các khả năng nâng cao như thao tác mảng và ma trận [5], xử lý hình ảnh [12], xử lý tín hiệu số [5] và trực quan hóa [7].digital signal processing [5], and visualization [7].