Để 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 baudNế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ácGiả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[]
1Hoặc trong Python3
from pathlib import Path
Path['path/to/file.txt'].touch[]
3Nế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êmfrom 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[]
14Mộ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[]
35Mộ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à 3Viế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 theofrom pathlib import Path
Path['path/to/file.txt'].touch[]
5Mộ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ệufrom pathlib import Path
Path['path/to/file.txt'].touch[]
1Trang 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úngKhi 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