Bộ lọc cosine gốc nuôi trăn

Để có ISI [Nhiễu giữa các ký hiệu] tối thiểu, đáp ứng tổng thể của bộ lọc truyền, đáp ứng kênh và bộ lọc nhận phải thỏa mãn tiêu chí Nyquist ISI. Bộ lọc cosine nâng cao là đáp ứng bộ lọc phổ biến nhất đáp ứng tiêu chí này. Một nửa quá trình lọc này được thực hiện ở phía truyền và một nửa được thực hiện ở phía nhận. Ở phía bên nhận, phản hồi của kênh, nếu có thể được ước tính chính xác, cũng có thể được tính đến để phản hồi tổng thể là phản hồi của bộ lọc cosine nâng cao

Mô tả toán học[sửa]

Đáp ứng xung của bộ lọc cosin tăng gốc nhân với Ts, cho ba giá trị của β. 1. 0 [màu xanh], 0. 5 [đỏ] và 0 [xanh]

Bộ lọc RRC được đặc trưng bởi hai giá trị;

Đáp ứng xung của bộ lọc như vậy có thể được đưa ra dưới dạng[cần dẫn nguồn]

h[t]={1Ts[1+β[4π−1]],t=0βTs2[[1+2π]sin⁡[π4β]+[1−2π]cos⁡[π4β]], ,

mặc dù có những hình thức khác là tốt

Không giống như bộ lọc cosin tăng, đáp ứng xung không bằng 0 tại các khoảng ±Ts. Tuy nhiên, các bộ lọc truyền và nhận được kết hợp tạo thành một bộ lọc cosin tăng không bằng 0 ở các khoảng ±Ts. Chỉ trong trường hợp β=0 thì cosin nâng gốc mới có 0 tại ±Ts

SciPy/Numpy dường như hỗ trợ nhiều bộ lọc, nhưng không hỗ trợ bộ lọc cosin gốc. Có mẹo nào để dễ dàng tạo một cái thay vì tính toán hàm truyền không?

Giải pháp tốt nhất

Gói

from pathlib import Path

Path['path/to/file.txt'].touch[]
6 có một số bộ lọc đi kèm. Thứ tự của các biến trả về đã được thay đổi trong phiên bản cũ hơn [kể từ lần chỉnh sửa này, phiên bản hiện tại là 0. 7. 0]. Để cài đặt, hãy nhấn mạnh văn bản theo hướng dẫn tại đây hoặc tại đây

Đây là ví dụ sử dụng cho 1024 ký hiệu của QAM16

import numpy as np
from commpy.modulation import QAMModem
from commpy.filters import rrcosfilter
N = 1024  # Number of symbols
os = 8 #over sampling factor
# Create modulation. QAM16 makes 4 bits/symbol
mod1 = QAMModem[16]
# Generate the bit stream for N symbols
sB = np.random.randint[0, 2, N*mod1.num_bits_symbol]
# Generate N complex-integer valued symbols
sQ = mod1.modulate[sB]
sQ_upsampled = np.zeros[os*[len[sQ]-1]+1,dtype = np.complex64] 
sQ_upsampled[::os] = sQ
# Create a filter with limited bandwidth. Parameters:
#      N: Filter length in samples
#    0.8: Roll off factor alpha
#      1: Symbol period in time-units
#     24: Sample rate in 1/time-units
sPSF = rrcosfilter[N, alpha=0.8, Ts=1, Fs=over_sample][1]
# Analog signal has N/2 leading and trailing near-zero samples
qW = np.convolve[sPSF, sQ_upsampled]

Dưới đây là một số giải thích về các thông số.

from pathlib import Path

Path['path/to/file.txt'].touch[]
7 là số mẫu baud. Bạn cần gấp 4 lần số bit [trong trường hợp QAM] so với mẫu. Tôi đã trả về mảng
from pathlib import Path

Path['path/to/file.txt'].touch[]
8 với các phần tử
from pathlib import Path

Path['path/to/file.txt'].touch[]
7 để chúng ta có thể thấy tín hiệu với các mẫu đầu và cuối. Xem trang bộ lọc Root-raised-cosine của Wikipedia để giải thích về tham số
from pathlib import Path

Path['path/to/file.txt'].touch[]
1.
from pathlib import Path

Path['path/to/file.txt'].touch[]
2 là khoảng thời gian ký hiệu tính bằng giây và
from pathlib import Path

Path['path/to/file.txt'].touch[]
3 là số lượng mẫu bộ lọc trên mỗi
from pathlib import Path

Path['path/to/file.txt'].touch[]
2. Tôi thích giả vờ là 15 để giữ cho mọi thứ đơn giản [tỷ lệ ký hiệu đơn vị]. Thì
from pathlib import Path

Path['path/to/file.txt'].touch[]
3 là số lượng mẫu dạng sóng phức tạp trên mỗi điểm baud

Nếu bạn sử dụng phần tử trả về 0 từ

from pathlib import Path

Path['path/to/file.txt'].touch[]
7 để lấy chỉ số thời gian lấy mẫu, bạn cần chèn đúng chu kỳ ký hiệu và lọc tốc độ lấy mẫu trong
from pathlib import Path

Path['path/to/file.txt'].touch[]
2 và
from pathlib import Path

Path['path/to/file.txt'].touch[]
3 để các giá trị chỉ mục được chia tỷ lệ chính xác

Giải pháp liên quan

Python – Triển khai cảm ứng bằng Python

Có vẻ như điều này là mới kể từ Python 3. 4 -

from pathlib import Path

Path['path/to/file.txt'].touch[]

Điều này sẽ tạo một

from pathlib import Path

Path['path/to/file.txt'].touch[]
11 tại đường dẫn

--

Đường dẫn. chạm [chế độ = 0o777, tồn tại_ok = Đúng]

Tạo một tệp tại đường dẫn đã cho này. Nếu chế độ được cung cấp, nó được kết hợp với giá trị ô của quy trình để xác định chế độ tệp và cờ truy cập. Nếu tệp đã tồn tại, chức năng thành công nếu tồn tại_ok là đúng [và thời gian sửa đổi của nó được cập nhật đến thời điểm hiện tại], nếu không thì FileExistsError được nâng lên

Python – Tạo một singleton trong Python

Sử dụng một siêu dữ liệu

Tôi muốn giới thiệu Phương pháp #2, nhưng bạn nên sử dụng siêu dữ liệu hơn là lớp cơ sở. Đây là một thực hiện mẫu

from pathlib import Path

Path['path/to/file.txt'].touch[]
1

Hoặc trong Python3

from pathlib import Path

Path['path/to/file.txt'].touch[]
3

Nếu bạn muốn chạy

from pathlib import Path

Path['path/to/file.txt'].touch[]
12 mỗi khi lớp được gọi, hãy thêm

from pathlib import Path

Path['path/to/file.txt'].touch[]
5

đến câu lệnh

from pathlib import Path

Path['path/to/file.txt'].touch[]
13 trong
from pathlib import Path

Path['path/to/file.txt'].touch[]
14

Một vài từ về siêu dữ liệu. Siêu dữ liệu là lớp của một lớp; . Bạn tìm thấy siêu dữ liệu của một đối tượng trong Python với

from pathlib import Path

Path['path/to/file.txt'].touch[]
15. Các lớp kiểu mới bình thường thuộc loại
from pathlib import Path

Path['path/to/file.txt'].touch[]
16.
from pathlib import Path

Path['path/to/file.txt'].touch[]
17 trong đoạn mã trên sẽ thuộc loại
from pathlib import Path

Path['path/to/file.txt'].touch[]
18, giống như trường hợp [duy nhất] của
from pathlib import Path

Path['path/to/file.txt'].touch[]
17 sẽ thuộc loại
from pathlib import Path

Path['path/to/file.txt'].touch[]
30. Khi bạn gọi logger bằng
from pathlib import Path

Path['path/to/file.txt'].touch[]
31, Python trước tiên sẽ hỏi siêu dữ liệu của
from pathlib import Path

Path['path/to/file.txt'].touch[]
17,
from pathlib import Path

Path['path/to/file.txt'].touch[]
33, phải làm gì, cho phép tạo phiên bản trước. Quá trình này giống như Python hỏi một lớp phải làm gì bằng cách gọi
from pathlib import Path

Path['path/to/file.txt'].touch[]
34 khi bạn tham chiếu một trong các thuộc tính của nó bằng cách thực hiện
from pathlib import Path

Path['path/to/file.txt'].touch[]
35

Một siêu dữ liệu về cơ bản quyết định định nghĩa của một lớp nghĩa là gì và cách triển khai định nghĩa đó. Xem ví dụ http. //mã số. trạng thái kích hoạt. com/recipes/498149/, về cơ bản tạo lại các

from pathlib import Path

Path['path/to/file.txt'].touch[]
36 kiểu C trong Python bằng cách sử dụng siêu dữ liệu. Chủ đề Một số trường hợp sử dụng [cụ thể] cho siêu dữ liệu là gì?

Trong tình huống này, nếu bạn sử dụng Phương pháp #2 của mình và một lớp con định nghĩa một phương thức

from pathlib import Path

Path['path/to/file.txt'].touch[]
37, thì nó sẽ được thực thi mỗi khi bạn gọi
from pathlib import Path

Path['path/to/file.txt'].touch[]
38 -- bởi vì nó chịu trách nhiệm gọi phương thức trả về thể hiện được lưu trữ. Với một siêu dữ liệu, nó sẽ chỉ được gọi một lần, khi phiên bản duy nhất được tạo. Bạn muốn tùy chỉnh ý nghĩa của việc gọi lớp, điều này được quyết định bởi loại của nó

Nói chung, nên sử dụng một siêu dữ liệu để triển khai một singleton. Một singleton đặc biệt vì chỉ được tạo một lần và siêu dữ liệu là cách bạn tùy chỉnh việc tạo một lớp. Sử dụng siêu dữ liệu cho phép bạn kiểm soát nhiều hơn trong trường hợp bạn cần tùy chỉnh các định nghĩa lớp đơn lẻ theo những cách khác

Các singleton của bạn sẽ không cần đa kế thừa [vì siêu dữ liệu không phải là lớp cơ sở], nhưng đối với các lớp con của lớp đã tạo sử dụng đa kế thừa, bạn cần đảm bảo rằng lớp singleton là lớp đầu tiên/ngoài cùng bên trái với siêu dữ liệu xác định lại . Phiên bản dict không có trong không gian tên của phiên bản nên nó sẽ không vô tình ghi đè lên nó

Bạn cũng sẽ nghe nói rằng mẫu singleton vi phạm "Nguyên tắc Trách nhiệm Đơn lẻ" -- mỗi lớp chỉ nên làm một việc. Bằng cách đó, bạn không phải lo lắng về việc mã sẽ làm rối tung thứ này nếu bạn cần thay đổi thứ khác, bởi vì chúng tách biệt và được đóng gói. Việc triển khai siêu dữ liệu vượt qua bài kiểm tra này. Siêu dữ liệu chịu trách nhiệm thực thi mẫu và lớp và các lớp con được tạo không cần phải biết rằng chúng là các lớp đơn. Phương pháp # 1 không thành công trong bài kiểm tra này, như bạn đã lưu ý với "Bản thân MyClass là một hàm, không phải là một lớp, vì vậy bạn không thể gọi các phương thức lớp từ nó. "

Phiên bản tương thích Python 2 và 3

Viết thứ gì đó hoạt động trong cả Python2 và 3 yêu cầu sử dụng sơ đồ phức tạp hơn một chút. Vì các siêu lớp thường là các lớp con của loại

from pathlib import Path

Path['path/to/file.txt'].touch[]
16, nên có thể sử dụng một lớp để tạo động một lớp cơ sở trung gian tại thời điểm chạy với nó làm siêu lớp của nó và sau đó sử dụng lớp đó làm lớp cơ sở của lớp cơ sở
from pathlib import Path

Path['path/to/file.txt'].touch[]
33 công khai. Thật khó để giải thích hơn là làm, như minh họa tiếp theo

from pathlib import Path

Path['path/to/file.txt'].touch[]
5

Một khía cạnh mỉa mai của cách tiếp cận này là nó sử dụng phân lớp để thực hiện một siêu dữ liệu. Một lợi thế có thể có là, không giống như siêu dữ liệu thuần túy,

from pathlib import Path

Path['path/to/file.txt'].touch[]
52 sẽ trả về
from pathlib import Path

Path['path/to/file.txt'].touch[]
53

Đính chính

Về một chủ đề khác, có thể bạn đã nhận thấy điều này, nhưng việc triển khai lớp cơ sở trong bài viết gốc của bạn là sai.

from pathlib import Path

Path['path/to/file.txt'].touch[]
54 cần được tham chiếu trên lớp, bạn cần sử dụng
from pathlib import Path

Path['path/to/file.txt'].touch[]
55 hoặc bạn đang đệ quy và
from pathlib import Path

Path['path/to/file.txt'].touch[]
37 thực sự là một phương thức tĩnh mà bạn phải chuyển lớp tới, không phải là một phương thức lớp, vì lớp thực tế chưa được tạo . Tất cả những điều này cũng sẽ đúng đối với việc triển khai siêu dữ liệu

from pathlib import Path

Path['path/to/file.txt'].touch[]
1

Trang trí trả lại một lớp

Ban đầu tôi đang viết bình luận nhưng nó quá dài, vì vậy tôi sẽ thêm nó vào đây. Phương pháp #4 tốt hơn phiên bản trang trí khác, nhưng nó nhiều mã hơn mức cần thiết cho một singleton và không rõ nó làm gì

Các vấn đề chính xuất phát từ lớp là lớp cơ sở của chính nó. Đầu tiên, có lạ không khi một lớp là lớp con của một lớp gần như giống hệt nhau có cùng tên chỉ tồn tại trong thuộc tính

from pathlib import Path

Path['path/to/file.txt'].touch[]
57 của nó? . Điều này có nghĩa là lớp của bạn không thể tùy chỉnh
from pathlib import Path

Path['path/to/file.txt'].touch[]
37 và không thể xuất phát từ bất kỳ lớp nào cần gọi
from pathlib import Path

Path['path/to/file.txt'].touch[]
12 trên chúng

Khi nào nên sử dụng mẫu đơn

Trường hợp sử dụng của bạn là một trong những ví dụ tốt hơn về việc muốn sử dụng một người độc thân. Bạn nói trong một trong những nhận xét "Đối với tôi, việc ghi nhật ký dường như luôn là một ứng cử viên tự nhiên cho Singletons. " Bạn hoàn toàn đúng

Khi mọi người nói những người độc thân là xấu, lý do phổ biến nhất là họ đang ngầm chia sẻ trạng thái. Trong khi với các biến toàn cục và nhập mô-đun cấp cao nhất ở trạng thái chia sẻ rõ ràng, các đối tượng khác được truyền xung quanh thường được khởi tạo. Đây là một điểm tốt, với hai ngoại lệ

Điều đầu tiên và điều được đề cập ở nhiều nơi khác nhau là khi các singletons không đổi. Việc sử dụng các hằng số toàn cầu, đặc biệt là enums, được chấp nhận rộng rãi và được coi là lành mạnh vì dù thế nào đi chăng nữa, không người dùng nào có thể gây rối chúng cho bất kỳ người dùng nào khác. Điều này cũng đúng đối với một singleton không đổi

Ngoại lệ thứ hai, ít được đề cập hơn, thì ngược lại -- khi singleton chỉ là nơi chứa dữ liệu chứ không phải nguồn dữ liệu [trực tiếp hoặc gián tiếp]. Đây là lý do tại sao logger cảm thấy giống như việc sử dụng "tự nhiên" cho người độc thân. Vì những người dùng khác nhau không thay đổi bộ ghi theo cách mà những người dùng khác sẽ quan tâm, nên không có trạng thái chia sẻ thực sự. Điều này phủ nhận đối số chính chống lại mẫu đơn và làm cho chúng trở thành một lựa chọn hợp lý vì chúng dễ sử dụng cho tác vụ

Đây là một trích dẫn từ http. //googletesting. blogspot. com/2008/08/root-cause-of-singletons. html

Bây giờ, có một loại Singleton là OK. Đó là một singleton trong đó tất cả các đối tượng có thể truy cập là bất biến. Nếu tất cả các đối tượng là bất biến thì Singleton không có trạng thái toàn cầu, vì mọi thứ đều không đổi. Nhưng để biến loại đơn lẻ này thành loại có thể thay đổi thì quá dễ, đó là một con dốc rất trơn. Vì vậy, tôi cũng phản đối những người Độc thân này, không phải vì họ xấu mà vì họ rất dễ trở nên tồi tệ. [Như một lưu ý phụ, phép liệt kê Java chỉ là những loại đơn này. Miễn là bạn không đưa trạng thái vào bảng liệt kê của mình thì bạn vẫn ổn, vì vậy xin đừng. ]

Loại Singletons khác, được bán chấp nhận được là những loại không ảnh hưởng đến việc thực thi mã của bạn, Chúng không có "tác dụng phụ". Ghi nhật ký là ví dụ hoàn hảo. Nó được tải với Singletons và trạng thái toàn cầu. Nó có thể chấp nhận được [vì nó sẽ không làm hại bạn] vì ứng dụng của bạn không hoạt động khác biệt cho dù một trình ghi cụ thể có được bật hay không. Thông tin ở đây chảy một chiều. Từ ứng dụng của bạn vào bộ ghi. Ngay cả khi cho rằng bộ ghi nhật ký là trạng thái toàn cầu vì không có thông tin nào từ bộ ghi nhật ký vào ứng dụng của bạn, bộ ghi nhật ký vẫn được chấp nhận. Bạn vẫn nên sử dụng trình ghi nhật ký của mình nếu bạn muốn thử nghiệm của mình khẳng định rằng có thứ gì đó đang được ghi lại, nhưng nói chung Trình ghi nhật ký không có hại mặc dù có đầy đủ trạng thái

Chủ Đề