PHP และแบบฟอร์ม PHP และรูปแบบวิทยุประเภทอินพุตรับค่า php

วิธีค้นหาอย่างถูกต้องโดยใช้ google.com

ทุกคนคงรู้วิธีใช้เครื่องมือค้นหาเช่น Google =) แต่ไม่ใช่ทุกคนที่รู้ว่าหากคุณเขียนคำค้นหาอย่างถูกต้องโดยใช้โครงสร้างพิเศษคุณจะได้รับผลลัพธ์ของสิ่งที่คุณกำลังมองหาอย่างมีประสิทธิภาพและรวดเร็วยิ่งขึ้น =) ในบทความนี้ ฉันจะพยายามแสดงสิ่งนั้นและสิ่งที่คุณต้องทำเพื่อค้นหาอย่างถูกต้อง

Google สนับสนุนโอเปอเรเตอร์การค้นหาขั้นสูงหลายตัวที่มีความหมายพิเศษเมื่อค้นหาบน google.com โดยทั่วไป ข้อความเหล่านี้จะเปลี่ยนการค้นหา หรือแม้แต่บอกให้ Google ทำการค้นหาประเภทต่างๆ กันโดยสิ้นเชิง ตัวอย่างเช่นการออกแบบ ลิงค์:เป็นผู้ดำเนินการพิเศษและการร้องขอ ลิงค์:www.google.comจะไม่ทำการค้นหาแบบปกติให้คุณ แต่จะค้นหาหน้าเว็บทั้งหมดที่มีลิงก์ไปยัง google.com แทน
ประเภทคำขอทางเลือก

แคช:หากคุณใส่คำอื่นๆ ในข้อความค้นหา Google จะเน้นคำที่รวมไว้ในเอกสารแคช
ตัวอย่างเช่น, แคช:www.เว็บไซต์จะแสดงเนื้อหาที่แคชโดยเน้นคำว่า "เว็บ"

ลิงค์:ข้อความค้นหาด้านบนจะแสดงหน้าเว็บที่มีลิงก์ไปยังข้อความค้นหาที่ระบุ
ตัวอย่างเช่น: ลิงค์:www.siteจะแสดงทุกหน้าที่มีลิงค์ไปยัง http://www.site

ที่เกี่ยวข้อง:แสดงหน้าเว็บที่ “เกี่ยวข้อง” กับหน้าเว็บที่ระบุ
ตัวอย่างเช่น, ที่เกี่ยวข้อง: www.google.comจะแสดงรายการหน้าเว็บที่คล้ายกับหน้าแรกของ Google

ข้อมูล:ข้อมูลการค้นหา: จะนำเสนอข้อมูลบางส่วนที่ Google มีเกี่ยวกับหน้าเว็บที่คุณร้องขอ
ตัวอย่างเช่น, ข้อมูล:เว็บไซต์จะแสดงข้อมูลเกี่ยวกับฟอรัมของเรา =) (Armada - ฟอรัมผู้ดูแลเว็บสำหรับผู้ใหญ่)

การร้องขอข้อมูลอื่น ๆ

กำหนด:แบบสอบถามกำหนด: จะให้คำจำกัดความของคำที่คุณป้อนหลังจากนั้น โดยรวบรวมจากแหล่งข้อมูลออนไลน์ต่างๆ คำจำกัดความจะใช้สำหรับทั้งวลีที่ป้อน (นั่นคือ จะรวมคำทั้งหมดในการสืบค้นที่ตรงกันทุกประการ)

หุ้น:หากคุณเริ่มค้นหาด้วยหุ้น: Google จะประมวลผลคำค้นหาที่เหลือเป็นสัญลักษณ์หุ้น และลิงก์ไปยังหน้าที่แสดงข้อมูลสำเร็จรูปสำหรับสัญลักษณ์เหล่านี้
ตัวอย่างเช่น, หุ้น:อินเทล yahooจะแสดงข้อมูลเกี่ยวกับ Intel และ Yahoo (โปรดทราบว่าคุณควรพิมพ์สัญลักษณ์ข่าวด่วน ไม่ใช่ชื่อบริษัท)

ตัวแก้ไขแบบสอบถาม

เว็บไซต์:หากคุณรวม site: ในข้อความค้นหาของคุณ Google จะจำกัดผลลัพธ์ไว้เฉพาะเว็บไซต์ที่พบในโดเมนนั้น
คุณยังสามารถค้นหาตามแต่ละโซนได้ เช่น ru, org, com ฯลฯ ( เว็บไซต์:ดอทคอม เว็บไซต์:ru)

ชื่อทั้งหมด:หากคุณเรียกใช้การค้นหาด้วย allintitle: Google จะจำกัดผลลัพธ์ไว้เฉพาะคำค้นหาทั้งหมดในชื่อ
ตัวอย่างเช่น, allintitle: ค้นหาโดย Googleจะแสดงหน้า Google ทั้งหมดโดยการค้นหา เช่น รูปภาพ บล็อก ฯลฯ

ชื่อ:หากคุณใส่ intitle: ในข้อความค้นหาของคุณ Google จะจำกัดผลลัพธ์ให้แสดงเฉพาะเอกสารที่มีคำนั้นในชื่อ
ตัวอย่างเช่น, intitle:ธุรกิจ

อัลลิเนิล:หากคุณเรียกใช้การค้นหาด้วย allinurl: Google จะจำกัดผลลัพธ์ไว้เฉพาะคำค้นหาทั้งหมดใน URL
ตัวอย่างเช่น, allinurl: ค้นหาโดย Googleจะแสดงเอกสารด้วย google และค้นหาในชื่อเรื่อง นอกจากนี้ คุณสามารถแยกคำด้วยเครื่องหมายทับ (/) จากนั้นคำที่อยู่ทั้งสองด้านของเครื่องหมายทับจะถูกค้นหาในหน้าเดียวกัน: ตัวอย่าง allinurl: foo/bar

ใส่ URL:หากคุณรวม inurl: ในข้อความค้นหาของคุณ Google จะจำกัดผลลัพธ์ไว้เฉพาะเอกสารที่มีคำนั้นใน URL
ตัวอย่างเช่น, ภาพเคลื่อนไหว inurl:site

ข้อความ:ค้นหาเฉพาะคำที่ระบุในข้อความของหน้าโดยไม่สนใจชื่อและข้อความของลิงก์และสิ่งอื่น ๆ ที่ไม่เกี่ยวข้อง นอกจากนี้ยังมีอนุพันธ์ของตัวแก้ไขนี้ - ข้อความทั้งหมด:เหล่านั้น. นอกจากนี้ทุกคำในแบบสอบถามจะถูกค้นหาเฉพาะในข้อความเท่านั้นซึ่งมีความสำคัญเช่นกันโดยไม่สนใจคำที่ใช้บ่อยในลิงก์
ตัวอย่างเช่น, ข้อความ:ฟอรั่ม

ช่วงวันที่:การค้นหาในกรอบเวลา (ช่วงวันที่: 2452389-2452389) วันที่และเวลาจะแสดงในรูปแบบจูเลียน

และตัวอย่างข้อความค้นหาที่น่าสนใจทุกประเภท

ตัวอย่างการเขียนแบบสอบถามสำหรับ Google สำหรับผู้ส่งอีเมลขยะ

Inurl:control.guest?a=sign

เว็บไซต์:books.dreambook.com “URL หน้าแรก” “ลงชื่อเข้าใช้ของฉัน” inurl:sign

เว็บไซต์: www.freegb.net หน้าแรก

Inurl:sign.asp “จำนวนอักขระ”

“ข้อความ:” inurl:sign.cfm “ผู้ส่ง:”

Inurl:register.php “การลงทะเบียนผู้ใช้” “เว็บไซต์”

Inurl:edu/guestbook “ลงนามในสมุดเยี่ยม”

Inurl: โพสต์ “แสดงความคิดเห็น” “URL”

Inurl:/archives/ “ความคิดเห็น:” “จำข้อมูลได้ไหม?”

“สคริปต์และสมุดเยี่ยมชมสร้างโดย:” “URL:” “ความคิดเห็น:”

Inurl:?action=add “phpBook” “URL”

Intitle: "ส่งเรื่องใหม่"

นิตยสาร

Inurl:www.livejournal.com/users/ mode=reply

ใน URL ที่ยิ่งใหญ่ที่สุดjournal.com/ mode=reply

Inurl:fastbb.ru/re.pl?

Inurl:fastbb.ru /re.pl? "สมุดเยี่ยม"

บล็อก

Inurl:blogger.com/comment.g?”postID””ไม่ระบุชื่อ”

Inurl:typepad.com/ “โพสต์ความคิดเห็น” “จำข้อมูลส่วนบุคคลหรือไม่”

Inurl:greatestjournal.com/community/ “โพสต์ความคิดเห็น” “ที่อยู่ของผู้โพสต์ที่ไม่ระบุชื่อ”

“โพสต์ความคิดเห็น” “ที่อยู่ของผู้โพสต์ที่ไม่ระบุชื่อ” -

Intitle:"โพสต์ความคิดเห็น"

Inurl:pirillo.com “โพสต์ความคิดเห็น”

ฟอรั่ม

Inurl:gate.html?”name=Forums” “mode=reply”

Inurl:”forum/posting.php?mode=reply”

ใน URL:"mes.php?"

ใส่ URL:”members.html”

Inurl:forum/memberlist.php?”

การทดลองกับพวงกุญแจรถยนต์และเครื่องวิเคราะห์สัญญาณ baudline นั้นค่อนข้างน่าตื่นเต้น (ซึ่งจะมีการกล่าวถึงในรายละเอียดเพิ่มเติมในบทความก่อนหน้านี้) ตอนนี้เราจะพยายามทำสิ่งที่จริงจังกว่านี้ โดยที่สัญญาณเอาท์พุตมีค่ามากสำหรับเรา (สัญญาณจากกุญแจรถไม่มีค่ามากนัก เนื่องจากหลังจากการถอดรหัสแล้ว เราจะได้ตัวเลขสุ่มขนาดใหญ่)

การทดลองกับพวงกุญแจรถยนต์และเครื่องวิเคราะห์สัญญาณ Baudline นั้นน่าตื่นเต้นมาก (รายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้อธิบายไว้ใน) ตอนนี้เราจะพยายามทำสิ่งที่จริงจังกว่านี้ โดยที่สัญญาณเอาท์พุตมีค่ามากสำหรับเรา (สัญญาณจากกุญแจรถไม่มีค่ามากนัก เนื่องจากหลังจากการถอดรหัสแล้ว เราจะได้ตัวเลขสุ่มขนาดใหญ่)

ในการทดลองนี้ เครื่องส่งสัญญาณทดลองทำงานที่ความถี่ 433 MHz บนแพลตฟอร์ม Arduino ซึ่งคุณสามารถสร้างวัตถุอิเล็กทรอนิกส์เชิงโต้ตอบได้

รูปที่ 1: เครื่องส่งสัญญาณทดลอง

เรารู้ว่าสัญญาณถูกส่งที่ความถี่ 433 MHz ดังนั้นเราจะจับสัญญาณ (โดยใช้ HackRF) ที่ความถี่ 435 MHz:

$ hackrf_transfer -r 435MHz-ASK-HACKRF-CW-8M.iq -f 435000000 -s 8000000

หลังจากโหลดผลลัพธ์ของ HackRF ลงในเครื่องวิเคราะห์สัญญาณ Baudline (วิธีการทำเช่นนี้อธิบายไว้ในบทความก่อนหน้านี้) เราจะได้สิ่งต่อไปนี้:

รูปที่ 2: สัญญาณในตัววิเคราะห์ Baudline

เราได้รับสัญญาณที่ยอมรับได้ และจะอัปโหลดข้อมูลนี้ไปยัง GNU Radio Companion (GRC)

GRC ช่วยให้คุณสร้างผังงานโดยใช้อินเทอร์เฟซแบบกราฟิก จากนั้นบล็อกเหล่านี้จะถูกคอมไพล์เป็นโค้ด Python และสามารถใช้งานได้โดยอิสระจาก GRC คุณสามารถบรรลุสิ่งเดียวกันได้โดยการเขียนโค้ดโดยใช้บล็อก GNU Radio แต่ GRC มีคุณสมบัติที่มีประโยชน์มากมายและใช้งานได้ง่ายกว่าสำหรับผู้เริ่มต้น ซึ่งฉันก็นับรวมตัวเองด้วย อย่างไรก็ตาม เชลล์กราฟิก GRC ก็มีข้อเสียเช่นกัน บางครั้งการค้นหาบล็อกที่ถูกต้องอาจเป็นเรื่องยาก ในกรณีนี้ ให้ลองค้นหาโดยใช้ชื่อ

ขั้นตอนแรกคือการแปลงไฟล์บันทึก HackRF เป็นรูปแบบที่ GNU Radio สามารถอ่านได้ บันทึก HackRF คือข้อมูลที่เป็นคู่ของ IQ ซึ่งจัดเก็บเป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงนาม (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ IQ หรือการสุ่มตัวอย่างพื้นที่สี่เหลี่ยมจัตุรัส) โดยปกติแล้ว ส่วนประกอบวิทยุ GNU ต้องการข้อมูล IQ ที่ซับซ้อน ดังนั้นเราจึงต้องแปลงไฟล์ของเราเป็นรูปแบบนี้ (อัลกอริทึมแสดงในรูปด้านล่าง):

รูปที่ 3: ผังงานของอัลกอริธึมการแปลงสัญญาณสำหรับ GNU Radio

ขั้นแรก บล็อกไดอะแกรมใช้ส่วนประกอบ "แหล่งไฟล์" มาตรฐานในการโหลดไฟล์ จากนั้นบล็อก "UCar to Float" จะแปลงจำนวนเต็ม 8 บิตที่ไม่ได้ลงนามไปเป็นตัวเลขทศนิยม ในบล็อก "Deinterleave" สตรีมข้อมูลทั่วไป (IQIQIQ) จะถูกแบ่งออกเป็นสองช่องทางแยกกัน (I และ Q) หลังจากนั้นจะรวมกันอีกครั้ง แต่อยู่ในรูปแบบของจำนวนเชิงซ้อน (สำหรับสิ่งนี้ "Float to Complex" ” มีการใช้บล็อก) รูปแบบนี้ตรงกับที่ใช้ใน GNU Radio

หลังจากผ่านบล็อก "เพิ่ม Const" ข้อมูลจะมีศูนย์กลางประมาณ 0 (เนื่องจาก HackRF ใช้จำนวนเต็มที่ไม่ได้ลงนามในช่วง 0 ถึง 256 ข้อมูลจึงอยู่กึ่งกลางประมาณ 127) (ฉันต้องบอก Mike Ossman เกี่ยวกับเรื่องนี้ - อีกเหตุผลที่ดีมากในการสมัคร HackRF บน Kickstarter - หากตั้งเป้าหมายที่ทะเยอทะยานมากกว่านี้ เราก็จะได้รับหลักสูตรวิดีโอทาง GNU Radio)

บล็อก "คันเร่ง" สุดท้ายใช้เพื่อบีบอัดความถี่การสุ่มตัวอย่างเป็น 8 MHz เพื่อให้ระบบที่ใช้สัญญาณนี้ทำงานได้อย่างถูกต้อง โดยทั่วไป ฉันพบว่าการบีบอัดอัตราการสุ่มตัวอย่างของสัญญาณนั้นสมเหตุสมผล เพราะไม่เช่นนั้นอาจมีปฏิกิริยาโต้ตอบแบบสุ่มระหว่างอัตราการสุ่มตัวอย่างและความกว้างสเปกตรัมของสัญญาณ (ในกรณีของข้อมูล IQ อัตราการสุ่มตัวอย่างและความกว้างสเปกตรัมของสัญญาณจะเป็น มีความสัมพันธ์กัน)

ในขั้นตอนการบีบอัดจะใช้ตัวแปร throttle_rate (บล็อกบนสุดของวงจร) ซึ่งช่วยให้คุณตั้งค่าความถี่สำหรับสัญญาณต่างๆ ความประหลาดใจประการหนึ่งรอเราอยู่ที่นี่: GRC ไม่แสดงตัวเลขในรูปแบบที่ใช้จริง! GRC ยอมรับตัวเลขในรูปแบบปกติหรือรูปแบบวิทยาศาสตร์ (เลขฐานสิบหก ฐานแปด หรือรูปแบบใดก็ตามที่ Python รองรับ) แต่จะแสดงตัวเลขเหล่านั้นในรูปแบบที่มนุษย์สามารถอ่านได้ (ไม่สามารถระบุตัวเลขในรูปแบบนี้ได้) ในกรณีของเราค่าที่ยอมรับได้คือ 8000000 หรือ 8e6 อย่างไรก็ตามตัวเลข 8M นั้นยอมรับไม่ได้

ตอนนี้เราได้ไฟล์ที่ดาวน์โหลดในรูปแบบที่ต้องการแล้ว อะไรต่อไป?

ขั้นตอนแรกคือการศึกษาสัญญาณของเราโดยละเอียด เราสามารถส่งมันไปยังบล็อกที่มีการแปลงฟูริเยร์ที่รวดเร็วได้ทันทีหลังจากการบีบอัดสัญญาณ:

รูปที่ 4: พารามิเตอร์บล็อก Fast Fourier Transform

ที่เอาต์พุตของตัวแปลงเราได้รับสัญญาณต่อไปนี้:

รูปที่ 5: สัญญาณหลังจากตัวแปลง

ในรูปด้านบน เราเห็นจุดสูงสุดที่ความถี่การจับ (435 MHz) และส่วนหนึ่งของสัญญาณที่ส่งรอบความถี่ 433.8 MHz

ตอนนี้เรามาดูการตั้งค่าตัวแปลง ตามค่าเริ่มต้น GNU Radio ไม่รู้อะไรเลยเกี่ยวกับความถี่พาหะ (หากไม่ได้ระบุ จะถือว่าเป็นศูนย์) ในกรณีนี้ สัญญาณจะอยู่ที่ความถี่ -1.2 MHz แน่นอนว่าสิ่งนี้ไม่เหมาะกับฉัน และฉันจะกำหนดค่าที่แท้จริง:

รูปที่ 6: พารามิเตอร์ตัวแปลง FFT

พารามิเตอร์ "อัตราตัวอย่าง" และ "ความถี่เบสแบนด์" สอดคล้องกับตัวแปร "samp_rate" และ "capture_freq" พารามิเตอร์ "อัตราตัวอย่าง" จะต้องตรงกับสัญญาณอินพุต (ในกรณีของเราคือ 8 MHz ซึ่งเป็นค่าที่เราบีบอัดตัวอย่าง) มิฉะนั้นตัวแปลงจะทำงานไม่ถูกต้อง

ใน GRC เราใช้บล็อกที่เหมาะสมกับตัวแปร:

รูปที่ 7: บล็อกที่มีตัวแปร

เนื่องจากเรารู้ว่าสัญญาณของเราอยู่ที่ไหน การรับข้อมูลจึงดำเนินการที่ความถี่ออฟเซ็ตที่ 435 MHz เพื่อหลีกเลี่ยงจุดสูงสุดที่ความถี่การทำงาน นอกจากนี้เรายังเก็บข้อมูลได้มากกว่าที่เราต้องการ (สัมพันธ์กับความกว้างของสเปกตรัม) เพื่อแก้ไขปัญหาทั้งสองนี้ในคราวเดียว เราจะใช้บล็อกตัวกรอง FIR XLating ความถี่ XLating

รูปที่ 8: การใช้ตัวกรอง FIR ระดับกลาง

การใช้ตัวกรองดังกล่าวช่วยให้คุณสามารถแก้ไขปัญหาสามประการพร้อมกันได้:

  1. เปลี่ยนความถี่พาหะของสัญญาณ ดูเหมือนว่าเราจะ "เลื่อนลง" ไปยังส่วนที่ต้องการของสัญญาณ
  2. ใช้ตัวกรองแบนด์พาสเพื่อลบส่วนของสัญญาณที่เราไม่ต้องการออก นอกจากนี้ เมื่อเราดำเนินการวัด เราจะวัดเฉพาะสัญญาณของเราโดยไม่มีสัญญาณรบกวนวิทยุ
  3. แยกสัญญาณ. ซึ่งจะลดความกว้างของสเปกตรัมและจำนวนตัวอย่างสัญญาณ ซึ่งจะลดกำลังการประมวลผล เนื่องจากอัตราการสุ่มตัวอย่างลดลง เราจึงต้องคำนึงถึงสิ่งนี้เมื่อกำหนดค่าบล็อกที่ตามมา

รูปที่ 9: พารามิเตอร์ตัวกรอง FIR ระดับกลาง

ที่นี่เราใช้ตัวแปรอีกครั้งเพื่อตั้งค่าพารามิเตอร์การหาร (หรือการหาร) เนื่องจากวิธีนี้สะดวกกว่ามาก เพื่อให้ได้ค่าการสลายตัว เราจำเป็นต้องหารอัตราตัวอย่างอินพุตด้วยค่าเอาต์พุต (ในกรณีของเรา ค่าเอาต์พุตคือ 50 kHz ซึ่งเป็นค่าที่ค่อนข้างกำหนดเอง) 50 kHz กว้างพอที่จะครอบคลุมสัญญาณทั้งหมดของเรา และเราจะไม่มีปัญหาใดๆ ในภายหลังเนื่องจากสัญญาณมีความแรงมาก ในชีวิตจริงเราน่าจะใช้ค่าที่ต่ำกว่ามาก เราต้องแปลงผลลัพธ์เป็นจำนวนเต็มเพื่อให้ GRC ทำงานได้อย่างถูกต้อง (เราใช้ฟังก์ชัน Python int สำหรับสิ่งนี้)

เราผูกตัวแปร firdes_tap กับพารามิเตอร์ “Taps” (เพิ่มเติมเกี่ยวกับเรื่องนี้ในภายหลัง) ตัวเลือกนี้ช่วยให้เราแยกสัญญาณของเราได้

และสุดท้ายด้วยพารามิเตอร์ "ความถี่กลาง" เราตั้งค่าออฟเซ็ตของความถี่พาหะ (โดยใช้ตัวแปรอีกครั้ง) เราจำเป็นต้องเลื่อนสัญญาณลง ดังนั้นออฟเซ็ตจะอยู่ที่ประมาณ 1.2 MHz (หรือ 435 MHz - 433 MHz) เนื่องจากการเลื่อนลดลง ค่าจึงต้องเป็นลบ

ฉันใช้ GNU Radio 3.6 อย่างไรก็ตาม เวอร์ชันล่าสุดคือ 3.7 ซึ่งมีการเปลี่ยนแปลงบางอย่าง โดยเฉพาะอย่างยิ่ง พารามิเตอร์ "ความถี่กลาง" จะถือเป็นความถี่พาหะ "จริง" หากคุณใช้ GNU Radio 3.7 ให้ลบเครื่องหมายลบออก การเปลี่ยนแปลงเหล่านี้และการเปลี่ยนแปลงอื่น ๆ ในเวอร์ชันใหม่สามารถพบได้

[อัปเดต 9 กุมภาพันธ์ 2556 - หลังจากอัปเดต GNU Radio ฉันไม่ชัดเจนว่าการเปลี่ยนแปลงคืออะไร เนื่องจากออฟเซ็ตเชิงลบทำงานได้ดี แต่ออฟเซ็ตเชิงบวกไม่ทำงาน]

รูปที่ 10: ค่าของตัวแปร firdes_tap

ตัวแปร firdes_tap กำหนดตัวกรองความถี่ต่ำผ่านของเรา พารามิเตอร์หลักที่นี่คือ:

  1. Gain = 1 - เราไม่ขยายสัญญาณ
  2. อัตราการสุ่มตัวอย่าง (samp_rate) - สอดคล้องกับอัตราการสุ่มตัวอย่างของสัญญาณอินพุต (ในกรณีของเราคือ 8 MHz)
  3. ความถี่ตัด = 2000 - เรากำหนดความถี่ตัดเป็น 2 KHz
  4. ความถี่แถบการเปลี่ยนตัวกรอง = 20000 – ตั้งค่าแบนด์วิดท์การเปลี่ยนตัวกรองให้อยู่ที่ประมาณครึ่งหนึ่งของความถี่การสุ่มตัวอย่าง (ในกรณีของเรา ความถี่การสุ่มตัวอย่างสุดท้ายคือ 50 kHz ดังนั้นความถี่การเปลี่ยนจะอยู่ที่ประมาณ 20 kHz)

ตัวเลือก WIN_HAMMING และ 6.76 บอกให้ GNU Radio ใช้ตัวกรองหน้าต่าง คุณสามารถละเว้นพารามิเตอร์เหล่านี้ได้

หลังจากส่งสัญญาณผ่านตัวกรอง การทำลายล้าง และการปรับศูนย์กลางใหม่ เราจะส่งสัญญาณผ่านการแปลงฟูริเยร์อีกครั้ง ผลลัพธ์มีดังต่อไปนี้:

รูปที่ 11: สัญญาณที่ส่งผ่านตัวกรองและตัวแปลง

โปรดทราบว่าความกว้างสเปกตรัมของสัญญาณลดลง และการปรับให้เรียบก็เกิดขึ้นนอกภูมิภาคที่เรากำลังพิจารณาด้วย

ด้วยการตั้งค่าที่แตกต่างกันสำหรับตัวกรองความถี่ต่ำผ่าน คุณจะได้ผลลัพธ์ที่แตกต่างกัน (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการตั้งค่าตัวกรองความถี่ต่ำผ่าน)

อย่าลืมกำหนดค่าการแปลงฟูริเยร์:

รูปที่ 12: การตั้งค่าตัวส่งสัญญาณ

ควรให้ความสนใจเป็นพิเศษกับการเปลี่ยนแปลงความถี่สุ่มตัวอย่างสัญญาณของเรา (สูงสุด 50 kHz) และความถี่พาหะ ดังนั้นเราจึงตั้งค่าตัวแปรที่เหมาะสมในพารามิเตอร์ "Sample Rate" และ "Baseband Freq"

ตอนนี้เรามีสัญญาณมอดูเลตแอมพลิจูดย่านความถี่แคบที่กรองแล้ว เราจะทำอย่างไรกับเรื่องนี้?

ด้วยการมอดูเลตแอมพลิจูด แอมพลิจูดมีการเปลี่ยนแปลง และเราสามารถตรวจจับสัญญาณที่คล้ายกันได้โดยการวัดพารามิเตอร์นี้:

รูปที่ 13: วงจรการวัดสัญญาณ

บล็อก "Complex to Mag" จะแปลงสัญญาณ IQ ที่ซับซ้อนให้เป็นค่าสัมบูรณ์ เนื่องจากสัญญาณของเราแรงมากและยังผ่านตัวกรองด้วย เราจึงสามารถคำนวณแอมพลิจูดได้ หากสัญญาณไม่มีการกรองและมีสัญญาณรบกวน เราจะไม่สามารถใช้วิธีง่ายๆ เช่นนี้ได้

สังเกตสีของพิน "Out" ของบล็อก "Complex to Mag" (สีส้มแทนที่จะเป็นสีน้ำเงิน) ซึ่งหมายความว่าสัญญาณเอาท์พุตเป็นค่าจุดลอยตัว ดังนั้นบล็อกอินพุตจะต้องยอมรับสัญญาณประเภทนี้

รูปที่ 14: การตั้งค่าประเภทของสัญญาณที่ได้รับ

เราสามารถตั้งค่าประเภทสัญญาณได้ในเมนูแบบเลื่อนลงของตัวเลือก "ประเภท"

ตอนนี้เมื่อ GRC เริ่มต้น ผลลัพธ์จะเป็นขนาดที่คำนวณได้ หากเราเลื่อนดูช่วงเวลาโดยใช้ล้อเลื่อนของเมาส์ เราจะเห็นภาพต่อไปนี้:

รูปที่ 15: การแสดงกราฟิกของขนาดสัญญาณที่คำนวณได้

สัญญาณในภาพด้านบนดูดี เช่นเดียวกับสัญญาณที่ได้รับเมื่อดูในตัววิเคราะห์ Baudline ในกรณีหลังนี้ เราใช้การแยกและเน้นสัญญาณที่เป็นประโยชน์และแปลงเป็นลำดับขนาดที่คำนวณได้

รูปที่ 16: การเปรียบเทียบสัญญาณทั้งสอง

คุณสามารถดาวน์โหลดไฟล์ข้อมูลตัวอย่างได้จากที่นี่ และไฟล์ GRC จากที่นี่

ในบทความถัดไป เราจะพยายามแปลงสัญญาณจาก GRC กลับเป็นตัวอย่างดั้งเดิม

ขอขอบคุณ Mike Ossman ทุกคนจากช่อง #hackrf บน Freenode และโดยทั่วไปแล้ว ทุกคนที่ช่วยเขียนบทความนี้และแสดงความคิดเห็น

24.6ก

ไม่ใช่เรื่องเป็นความลับที่หน้า HTML โต้ตอบกับเว็บไซต์ที่พบบ่อยที่สุดก็คือแบบฟอร์ม แบบฟอร์ม (นั่นคือองค์ประกอบ HTML ที่เกิดจากแท็กแบบฟอร์ม) ยังใช้โดยบริการอีเมลฟรี ร้านค้าอิเล็กทรอนิกส์ และไซต์ประเภทอื่น ๆ อีกมากมาย

การประมวลผลแบบฟอร์มง่ายๆ โดยใช้ PHP เป็นเรื่องง่าย อย่างไรก็ตามในบางครั้งมีความจำเป็นต้องประมวลผลแบบฟอร์มที่มีหลายฟิลด์ที่เป็นประเภทเดียวกันแม้ว่าตัวเลขจะแตกต่างกันไปในช่วงกว้างและไม่ทราบหมายเลขล่วงหน้าก็ตาม ในกรณีดังกล่าว PHP จัดให้มีฟิลด์การประมวลผลประเภทเดียวกันกับอาร์เรย์ของค่า


มาดูตัวเลือกสำหรับฟิลด์ประเภทต่างๆ กัน

ช่องข้อความ

ในบทความนี้ ช่องข้อความอ้างถึงองค์ประกอบที่สร้างโดยแท็กอินพุตพร้อมค่าพารามิเตอร์ประเภทข้อความและแท็ก textarea วิธีที่ง่ายที่สุดในการจัดระเบียบการประมวลผลแบบฟอร์มที่ประกอบด้วยหลายฟิลด์ดังกล่าว รายการด้านล่างแสดงมาร์กอัป HTML สำหรับแบบฟอร์มดังกล่าว






ดังที่คุณเห็นจากรายการ ชื่อขององค์ประกอบของฟอร์ม จากมุมมองของ PHP นั้นเป็นองค์ประกอบของอาร์เรย์ ดังนั้นสคริปต์ PHP ที่จะประมวลผลแบบฟอร์มนี้จะถือว่าช่องข้อความจำนวนมากของแบบฟอร์มนี้เป็นอาร์เรย์เดียว แต่ละองค์ประกอบสามารถเข้าถึงได้โดยดัชนีหรือระบุโดยใช้รายการและแต่ละคำสั่ง ดังตัวอย่างต่อไปนี้

เอ็น"; ?>

สวิตช์

ในบทความนี้ ช่องทำเครื่องหมายคือองค์ประกอบที่สร้างขึ้นในแท็กอินพุตโดยตั้งค่าพารามิเตอร์ประเภทเป็นช่องทำเครื่องหมาย แบบฟอร์มสำหรับการใช้ "สวิตช์" จำนวนตัวแปรนั้นถูกสร้างขึ้นในลักษณะเดียวกันทุกประการ โปรดทราบว่าการเลือกค่าปุ่มตัวเลือกเฉพาะ (นั่นคือ ค่าของคุณสมบัติค่า) นั้นไม่สำคัญ ตัวอย่างแสดงอยู่ในรายการด้านล่าง:






อย่างไรก็ตาม การประมวลผลแบบฟอร์มดังกล่าวแตกต่างจากการประมวลผลที่อธิบายไว้สำหรับช่องข้อความ ในกรณีนี้ มีความจำเป็นต้องพิจารณาว่าผู้เยี่ยมชมไซต์ได้เปิดสวิตช์นี้หรือสวิตช์นั้น หากเปิดใช้งาน แสดงว่าองค์ประกอบอาร์เรย์ที่เกี่ยวข้องมีอยู่ หากไม่เป็นเช่นนั้น แสดงว่าองค์ประกอบนั้นหายไป รายการต่อไปนี้เป็นตัวอย่างสคริปต์ PHP ที่พิมพ์ปุ่มตัวเลือกที่เปิดใช้งาน:

ปุ่มวิทยุ

ก่อนที่จะอธิบายการประมวลผลปุ่มตัวเลือก จำเป็นต้องจำไว้ว่ามันทำงานอย่างไร สาระสำคัญของปุ่มตัวเลือก (องค์ประกอบที่สร้างโดยแท็กอินพุตที่มีค่าของพารามิเตอร์ประเภทเท่ากับ radio ) คือการเลือกปุ่มเดียว ผู้ใช้จะยกเลิกการเลือกปุ่มอื่นจากชุดเดียวกันโดยอัตโนมัติ ปุ่มต่างๆ ถูกรวมเข้าไว้ในชุดเดียวอย่างง่ายดาย: ปุ่มทั้งหมดในชุดมีชื่อเดียวกัน

แต่ค่า (นั่นคือพารามิเตอร์ค่า) ของปุ่มในชุดจะแตกต่างกัน และค่าของปุ่มที่เลือกพร้อมชื่อชุดจะถูกส่งไปยังไซต์ เช่นเดียวกับช่องข้อความและปุ่มตัวเลือก ชื่อของชุดของปุ่มตัวเลือกควรได้รับการจัดรูปแบบเป็นชื่อขององค์ประกอบอาร์เรย์ใน PHP ตัวอย่างของแบบฟอร์มดังกล่าวมีระบุไว้ในรายการต่อไปนี้:

// ปุ่มชุดแรก
// ปุ่มชุดที่สอง
// ปุ่มชุดที่สาม

การประมวลผลปุ่มตัวเลือกผสมผสานแนวคิดในการใช้ทั้งช่องข้อความและปุ่มตัวเลือกในการประมวลผล หากผู้เขียนหน้า html ไม่ได้ตั้งค่าเริ่มต้นและผู้ใช้ไม่ได้เลือกปุ่มเฉพาะในชุดปุ่มตัวเลือก องค์ประกอบนี้จะไม่อยู่ในอาร์เรย์ (สำหรับปุ่มตัวเลือก)

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

msg_receive — การดึงข้อความจากคิวข้อความ

คำอธิบาย

บูล msg_receive (ทรัพยากร $queue , int $desiredmsgtype , int &$msgtype , int $ขนาดสูงสุด , ผสม&$ข้อความ [, บูล $unserialize = จริง [, int $แฟล็ก = 0 [, int &$รหัสข้อผิดพลาด ]]])

msg_receive()รับข้อความแรกจากคิวข้อความที่ระบุโดยพารามิเตอร์คิวพร้อมประเภทที่ระบุใน Wishmsgtype

รายการพารามิเตอร์

ข้อความที่ต้องการ

ถ้าต้องการ msgtype เป็น 0 ข้อความแรกในคิวจะถูกส่งกลับ ถ้าต้องการ msgtype มากกว่า 0 ข้อความแรกที่มีประเภทที่ระบุจะถูกส่งกลับ หาก Wishmsgtype น้อยกว่า 0 ข้อความแรกที่มีประเภทน้อยกว่าหรือเท่ากับโมดูโลที่ระบุใน Wishmsgtype จะถูกส่งกลับ หากไม่มีข้อความที่ตรงกับเกณฑ์ สคริปต์ของคุณจะรอให้ข้อความเหล่านั้นปรากฏในคิว คุณสามารถเปลี่ยนลักษณะการทำงานนี้ได้โดยระบุ MSG_IPC_NOWAIT

ในพารามิเตอร์แฟล็ก

ประเภทข้อความ

พารามิเตอร์นี้เก็บประเภทของข้อความที่ได้รับ

ขนาดสูงสุด

ขนาดสูงสุดของข้อความที่ได้รับถูกตั้งค่าเป็น maxsize ;

หากข้อความในคิวมีขนาดใหญ่กว่าขนาดนี้ ฟังก์ชันจะล้มเหลว (เว้นแต่คุณจะตั้งค่าสถานะตามที่อธิบายไว้ด้านล่าง)

ข้อความ

ข้อความที่ได้รับจะถูกจัดเก็บไว้ในข้อความหากไม่มีข้อผิดพลาดขณะรับ จริงข้อความจะถือเป็นอนุกรมโดยใช้กลไกเดียวกับในโมดูลเซสชัน ข้อความถูกดีซีเรียลไลซ์แล้วส่งคืนไปยังสคริปต์ของคุณ วิธีนี้ช่วยให้คุณสามารถดึงข้อมูลอาร์เรย์และอ็อบเจ็กต์ที่ซับซ้อนจากสคริปต์ PHP อื่นๆ ได้อย่างง่ายดาย หรือหากคุณใช้ซีเรียลไลเซอร์ WDDX จากแหล่งใดๆ ก็ตามที่เข้ากันได้กับ WDDX

หากมีการระบุการยกเลิกการซีเรียลไลซ์ เท็จข้อความจะถูกส่งกลับเป็นสตริงที่ปลอดภัยแบบไบนารี

พารามิเตอร์แฟล็กเผื่อเลือกอนุญาตให้คุณส่งแฟล็กไปยังการเรียกระบบ msgrcv ระดับต่ำ ค่าเริ่มต้นคือ 0 แต่คุณสามารถระบุค่าต่อไปนี้ตั้งแต่หนึ่งค่าขึ้นไปได้ (โดยการเพิ่มหรือดำเนินการไบนารี OR)

รหัสข้อผิดพลาด

หากฟังก์ชันล้มเหลว พารามิเตอร์รหัสข้อผิดพลาดเผื่อเลือกจะมีค่าของตัวแปรระบบ errno

ส่งกลับค่า

การส่งคืน จริงเมื่อสำเร็จแล้วหรือ เท็จในกรณีที่มีข้อผิดพลาด

เมื่อดำเนินการเสร็จสิ้น โครงสร้างข้อมูลคิวข้อความจะได้รับการอัปเดตดังนี้: msg_lrpidมี ID ของกระบวนการโทร msg_qnumลดลง 1 และ msg_rtimeถูกตั้งค่าตามเวลาปัจจุบัน

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

msg_receive — รับข้อความจากคิวข้อความ

คำอธิบาย

msg_receive (ทรัพยากร $queue , int $desiredmsgtype , int &$msgtype , int $ขนาดสูงสุด , ผสม&$ข้อความ [, บูล $unserialize = จริง [, int $แฟล็ก = 0 [, int &$รหัสข้อผิดพลาด]]]) : บูล

msg_receive()จะได้รับข้อความแรกจากคิวที่ระบุประเภทที่ระบุโดย Wishmsgtype

พารามิเตอร์

ตัวจัดการทรัพยากรคิวข้อความ

ข้อความที่ต้องการ

ถ้าต้องการ msgtype เป็น 0 ข้อความจากด้านหน้าของคิวจะถูกส่งกลับ ถ้าต้องการ msgtype มากกว่า 0 ข้อความแรกของประเภทนั้นจะถูกส่งกลับ คุณสามารถเปลี่ยนลักษณะการทำงานนี้ได้โดยระบุถ้าต้องการ msgtype น้อยกว่า 0 ข้อความแรกในคิวที่มีประเภทน้อยกว่าหรือเท่ากับค่าสัมบูรณ์ของ msgtype ที่ต้องการจะถูกอ่าน

ในพารามิเตอร์แฟล็ก

หากไม่มีข้อความที่ตรงกับเกณฑ์ สคริปต์ของคุณจะรอจนกว่าข้อความที่เหมาะสมจะมาถึงคิว คุณสามารถป้องกันไม่ให้สคริปต์บล็อกได้โดยการระบุ

พารามิเตอร์นี้เก็บประเภทของข้อความที่ได้รับ

ในพารามิเตอร์แฟล็ก

ขนาดสูงสุดของข้อความที่ได้รับถูกตั้งค่าเป็น maxsize ;

ประเภทของข้อความที่ได้รับจะถูกเก็บไว้ในพารามิเตอร์นี้

ข้อความ

ขนาดสูงสุดของข้อความที่จะยอมรับจะถูกระบุโดยขนาดสูงสุด ; หากข้อความในคิวมีขนาดใหญ่กว่าขนาดนี้ ฟังก์ชันจะล้มเหลว (เว้นแต่คุณจะตั้งค่าสถานะตามที่อธิบายไว้ด้านล่าง) จริงข้อความจะได้รับการปฏิบัติราวกับว่ามันถูกทำให้เป็นอนุกรมโดยใช้กลไกเดียวกันกับโมดูลเซสชัน ข้อความจะไม่ซีเรียลไลซ์ จากนั้นจึงส่งคืนไปยังสคริปต์ของคุณ วิธีนี้ช่วยให้คุณรับอาร์เรย์หรือโครงสร้างอ็อบเจ็กต์ที่ซับซ้อนจากสคริปต์ PHP อื่นๆ ได้อย่างง่ายดาย หรือหากคุณใช้ซีเรียลไลเซอร์ WDDX จากแหล่งใดๆ ที่เข้ากันได้กับ WDDX

หากยกเลิกการซีเรียลไลซ์ เท็จข้อความจะถูกส่งกลับเป็นสตริงที่ปลอดภัยแบบไบนารี

แฟล็กเผื่อเลือกอนุญาตให้คุณส่งแฟล็กไปยังการเรียกระบบ msgrcv ระดับต่ำ โดยค่าเริ่มต้นจะเป็น 0 แต่คุณอาจระบุค่าต่อไปนี้อย่างน้อยหนึ่งค่าได้ (โดยการเพิ่มหรือ ORing เข้าด้วยกัน)

ค่าสถานะสำหรับ msg_receive
คุณสามารถเปลี่ยนลักษณะการทำงานนี้ได้โดยระบุ หากไม่มีข้อความประเภท msgtype ที่ต้องการ ให้ส่งคืนทันทีและไม่ต้องรอ ฟังก์ชันจะล้มเหลวและส่งกลับค่าจำนวนเต็มที่สอดคล้องกับ MSG_ENOMSG.
ผงชูรส_ยกเว้น การใช้แฟล็กนี้ร่วมกับdesirmsgtypeที่มากกว่า 0 จะทำให้ฟังก์ชันได้รับข้อความแรกที่ไม่เท่ากับdesiredmsgtype
MSG_NOERROR หากข้อความยาวกว่าขนาดสูงสุด การตั้งค่าสถานะนี้จะตัดข้อความให้มีขนาดสูงสุด และจะไม่ส่งสัญญาณข้อผิดพลาด
รหัสข้อผิดพลาด

หากฟังก์ชันล้มเหลว รหัสข้อผิดพลาดเผื่อเลือกจะถูกตั้งค่าเป็นค่าของตัวแปร errno ของระบบ

ส่งกลับค่า

การส่งคืน จริงในความสำเร็จหรือ เท็จเกี่ยวกับความล้มเหลว

เมื่อดำเนินการเสร็จสิ้น โครงสร้างข้อมูลคิวข้อความจะได้รับการอัปเดตดังนี้: msg_lrpidถูกตั้งค่าเป็น process-ID ของกระบวนการเรียก msg_qnumลดลง 1 และ msg_rtimeถูกตั้งค่าเป็นเวลาปัจจุบัน