كيفية رؤية الصدى أو نقل الفيديو عن طريق الصوت من خلال الماء - 2

مرحبا عزيزي!



اليوم سوف ننقل الصورة مرة أخرى بالموجات فوق الصوتية من خلال الماء: سنرى حرفيا صدى وصدى ، وحتى كيف تتغير تبعا للظروف. كل ما سأخبرك به بسيط ، من المثير للاهتمام أن أكرره بنفسي ويمكن أن يقوم به أي شخص تقريبًا.

إذا كان هناك شيء يرفرف في روحك من هذه الكلمات ، مرحبًا بك في كات ، في المياه المظلمة لبركتنا!




"أفضل ما في الأمر هو تفسير الحقائق المعروفة". (C) ABS ، الظهر ، القرن الثاني والعشرون


مقدمة


تتمثل القاعدة الأساسية لنادي شهود الصوتيات المائية في أنه لا يمكن نقل الفيديو الذي يستخدم الصوتيات المائية على مسافة أكثر أو أقل أهمية (أكثر من بضعة أمتار) في الجزء الأوسط من الماء ، وسيكون دائمًا مستحيلًا.
هناك أسباب وجيهة لذلك - قناة اتصال ذات نطاق ترددي منخفض للغاية ، وسرعة انتشار إشارة منخفضة (في الماء فقط 1500 م / ث) واحتمال كبير للخطأ. نطاق التردد المتاح هو فقط بضع عشرات من كيلو هرتز.
ولكن هذا ليس كل شيء - إذا ، على سبيل المثال ، إذا كانت الإشارة على ترددات بتردد 10 كيلو هرتز تنتشر في الماء على بعد حوالي 8-10 كم ، فعند تردد 20 كيلو هرتز ، تكون بالفعل 3-5 كم ، وكلما زاد التردد ، زاد التوهين. . على سبيل المثال ، تعمل أصغر أجهزة المودم uWAVE في العالم في النطاق 20-30 كيلو هرتز وتنقل البيانات بسرعة 78 بت / ثانية لكل 1000 متر ، و RedLINE مع نطاق من 5 إلى 8000 متر. ينتمي السجل بين الأجهزة التجارية إلى EvoLogics - 68 كيلو بت لكل 300 متر.
الفيزياء ، للأسف ، لا يمكن خداعها ومن المستحيل الموافقة عليها - يمكن أن تنتقل إما ببطء شديد ومناعة من الضوضاء ، أو بسرعة ، ولكن على مسافات قصيرة.
ومع ذلك ، في بعض الحالات ، يمكن "قطع بعض الزوايا" ، أي الزوايا التي سنقطعها هذه المرة تكون أقل.

ماذا سنفعل اليوم وما هو المطلوب لهذا؟


في المقالات السابقة ، أرسلنا بالفعل "فيديو" بصوت من خلال الماء ، وأذكرك أنه يوجد إطار "مرسوم على الطيف" ، أي الطيف ، أو بالأحرى كان الطيف للإشارة صورة.
في وقت لاحق ، صنعنا هوائيات صوتية بسيطة من القمامة وصنعنا المودم الصوتي البسيط . هناك أيضا قمنا بإعداد preamp للهوائي (لا يزال تصميم PCB للإنتاج الذاتي بواسطة LUT-أوم موجودًا هنا ).

كنا نفكر في الطريقة الأخرى التي يمكنك بها محاولة نقل الصورة بحيث يمكن لطالب رياض الأطفال معرفة ذلك ، وكما يبدو لنا ، فقد توصلوا إلى طريقة أبسط من ذي قبل.

لتلخيص ، قم بوضع قائمة بما نحتاج إليه:

- زوج من هوائيات السونار من ملتقطي الفطائر
- المضخم المصنعة من قبل LUT
- C # رمز مصدر المشروع
- زوج من بطاريات الرصاص في 12 فولت
- مكبر للصوت على TDA ، أخذت واحدة مقابل 50 روبل فقط على علي

قليلا من الناحية النظرية


أذكر أن مودم السونار الخاص بنا كان مبني على كاشف بسيط للون ، تردده أقل 4 مرات من تردد أخذ العينات. أذكر باختصار كيف يعمل.


تظهر الصورة تذبذبتين تحولتا بالنسبة لبعضهما البعض على Pi / 2 - أي مراحل الجيب وجيب التمام. وإذا كان التردد أقل أربع مرات بالضبط من تردد أخذ العينات ، فحينئذٍ فقط 4 عينات تقع على هذه الفترة.
بالتأكيد لاحظت habuchitel أن كلتا الإشارتين قد تحولتا إلى Pi / 4. مع هذا التحول ، تأخذ الإشارة قيمتين فقط: √2 / 2 و -2 / 2.
والقيم المحددة ليست مهمة ، من المهم أنه يمكنك استخدام العلامات فقط: "+" و "-".

الآن يمكننا تمثيل مرحلة الجيب كسلسلة من العلامات "+" "+" "-" "-" ، ومرحلة جيب التمام باسم "+" "-" "-" + ".

تحت المفسد ، كرر الكاشف:
دع إشارة الإدخال تكون في المخزن المؤقت sn ، فلدينا حلقتان متوسطتان للحلقات لمراحل الجيب وجيب التمام - bs و bc من الحجم N. ولهما مؤشرات مشتركة للرأس والذيل - bH و bT. في اللحظة الأولى من الوقت ، bH = N-1 ، bT = 0. عداد دورة المتوسط ​​C = 0.
نأخذ 4 عينات من المخزن المؤقت الإدخال وإضافتها وفقا لتسلسل الأحرف.

a = sn(i)
bs(bH) = a
bc(bH) = a
s1 = s1 + a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+1)
bs(bH) = a
bc(bH) = -a
s1 = s1 + a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+2)
bs(bH) = -a
bc(bH) = -a
s1 = s1 - a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+3)
bs(bH) = -a
bc(bH) = a
s1 = s1 - a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N


بعد كل أربع عينات تم معالجتها ، نتحقق من عداد دورات المتوسط ​​وإذا تجاوز العدد N ، فإننا نحسب سعة الناقل cA:

if ++cycle >= N
cA = sqrt(s1 * s1 + s2 * s2)
cycle = 0
end



نأخذ هذه الطريقة كأساس ؛ ستكون مسؤولة عن "التزامن".
الآن دعونا نرى كيف يتم تشفير الصورة. أقترح استخدام التلاعب السعة . يتم التلاعب عندما تنقسم الإشارة إلى شرائح متساوية تسمى الرقائق أو الرموز ، ويتم تخزين بعض المعلمات المتغيرة (في حالتنا ، السعة) على طول الشريحة.
على سبيل المثال ، إذا استطعنا تغيير السعة في النطاق من 0 إلى 32767 (عينات 16 بت) ، ونحتاج إلى نقل 255 قيمة سطوع البكسل ، ثم لكل وحدة تغيير في سطوع البكسل ، فإن سعة الشريحة ستتغير إلى 32768/255 = 128.
معلمة مهمة أخرى هي طول الشريحة ، نبدأ بفترة حامل واحدة - أربع عينات في حالتنا.
وبالتالي ، سيتم إرسال الصورة بالبكسل بالبكسل ، ويستغرق كل بكسل 4 عينات ، وتكون السعة لهذه الفترة هي b [x، y] * 128 ، حيث b [x، y] هي قيمة سطوع البيكسل مع إحداثيات x و y في الصورة b.

دعنا نقدر سرعة النقل.
في المثال ، استخدمت حجم إطار 120 × 120 بكسل. هذا يعني أنه لنقل إطار واحد ، نحن بحاجة

120 × 120 × 4 = 57600 عينة ،

إذا كان تردد أخذ العينات 96 كيلو هرتز ، فإن إرسال إطار واحد سيستغرق وقتًا:

57600/96000 = 0.6 ثانية

من الواضح أننا نحتاج إلى نوع من التوقف المؤقت ، فاصل حماية معين ، حتى يتمكن الكاشف من تحديد بداية الإطار التالي. ولأسباب إنسانية ، افترض أن 0.1 ثانية تكفي بالنسبة لنا ، حيث تتلاشى جميع الأصداء (في الواقع لا). بعد ذلك ، في النهاية ، سينتهي معدل النقل:

1 / (0.6 + 0.1) = 1.428 لقطة في الثانية.

من السهل جدًا ارتكاب خطأ هنا ومحاولة حساب السرعة بالبت في الثانية. تعرف على مدى سرعة النقل التي لا تصدق:

120 * 120 * 8 / 1.428 = 80 627 نقطة أساس

ولكن ماذا يحدث إذا لم يكن لديّ وحدات بكسل 8 بت ، لكن وحدات بكسل 16 بت؟

120 * 120 * 16 / 1.428 = 161344 نقطة أساس

المهم هنا هو أنه ، مرة أخرى ، لا يمكن أن تسمى طريقة الإرسال الرقمية ، وأن مفهوم معدل البت ليس صالحًا تمامًا لذلك.
حاول حساب معدل البت لإشارة تلفزيونية تمثيلية. وللمتلقي كاشف؟ :)

لذلك ، على سبيل المثال ، ستبدو قطعة من الإشارة ، تنقل سطوع 10 بكسل ، تتغير قيمها بالتناوب: 1 2 1 2 1 2 1 2 1 2


الآن دعونا نرى كيف يعمل هذا في المثال. تعيش أساليب التشفير وفك الشفرة في فئة التشفير وتكون مسؤولة عن تعديل الصورة وإزالة تشكيلها:

 public double[] Encode(Bitmap source, double carrier, int pSize, int interframePauseMs) { Bitmap frame; if (source.PixelFormat != System.Drawing.Imaging.PixelFormat.Format8bppIndexed) frame = Grayscale.CommonAlgorithms.RMY.Apply(source); else frame = source; if (!frame.Size.Equals(frameSize)) frame = resizer.Apply(frame); int cols = frameSize.Width; int rows = frameSize.Height; int col = 0; int row = 0; double delta = Math.PI * 2 * carrier / sampleRate; double alpha = 0; double phase = 0; double pxAmplitude = 0; double chipLimit = Math.PI * 2 * chipSize; double pLimit = Math.PI * 2; List<double> samples = new List<double>(); bool isFinished = false; for (int i = 0; i < pSize; i++) { alpha = Math.Sin(phase); phase += delta; if (phase >= pLimit) { phase -= pLimit; } samples.Add(alpha * short.MaxValue); } while (!isFinished) { alpha = Math.Sin(phase); phase += delta; if (phase >= chipLimit) { phase -= chipLimit; pxAmplitude = (((double)frame.GetPixel(col, row).R) / 255.0) * short.MaxValue; if (++col >= cols) { if (++row >= rows) isFinished = true; else col = 0; } } samples.Add(alpha * pxAmplitude); } if (interframePauseMs > 0) { samples.AddRange(new double[(int)((((double)interframePauseMs) / 1000.0) * (double)sampleRate)]); } return samples.ToArray(); } 


يمكن ملاحظة من الكود أنه قبل تعديل الصورة ، تضاف بادئة المزامنة التي تتكون من نغمة نقية (عينات حجم الصورة) إلى إشارة الخرج - وهذا ضروري حتى يمكن أن يحدث التزامن على جانب الاستقبال قبل الصورة نفسها ويمكن أن يحدث بشكل عام في ظل ظروف معاكسة.
طريقة فك التشفير هي كما يلي:

 public Bitmap Decode(double[] samples, double carrier, int pSize) { int cols = frameSize.Width; int rows = frameSize.Height; int col = 0; int row = 0; Bitmap result = new Bitmap(cols, rows); double delta = Math.PI * 2 * carrier / sampleRate; double alpha = 0; double phase = 0; double chipLimit = Math.PI * 2 * chipSize; double chipAmplitude = 0; double maxAmplitude = WaveUtils.GetMaxAmplitude(samples); double pxMax = -maxAmplitude; double pxMin = maxAmplitude; double smp; for (int i = pSize; (i < samples.Length) && (row < rows); i++) { alpha = Math.Sin(phase); phase += delta; if (phase >= chipLimit) { phase -= chipLimit; chipAmplitude = (Math.Max(Math.Abs(pxMax), Math.Abs(pxMin)) / maxAmplitude); pxMin = maxAmplitude; pxMax = -maxAmplitude; var gs = Convert.ToByte(chipAmplitude * 255); result.SetPixel(col, row, Color.FromArgb(255, gs, gs, gs)); if (++col >= cols) { col = 0; row++; } } else { smp = samples[i] * alpha; if (smp > pxMax) pxMax = smp; if (smp < pxMin) pxMin = smp; } } return result; } 


يمكن ملاحظة أن كلا الطريقتين لا يرتبطان بأي تردد معين ويمكن استخدامه مع كاشف آخر.

يحدث بحث الإشارة نفسه (الاكتشاف ، المزامنة) كما هو الحال في أبسط مودم صوتي مائي لدينا ، مع أن الفرق الوحيد هو أن أضعه في فئة منفصلة FsBy4CarrierDetector لإجراء تغيير.
يحدث كل السحر غير المعقد في طريقة ProcessSample المنطقية (قصيرة)

 public bool ProcessSample(short a) { bool result = false; if (smpCount == 0) { ring1[ringHead] = a; ring2[ringHead] = a; s1 += a - ring1[ringTail]; s2 += a - ring2[ringTail]; } else if (smpCount == 1) { ring1[ringHead] = a; ring2[ringHead] = -a; s1 += a - ring1[ringTail]; s2 += - a - ring2[ringTail]; } else if (smpCount == 2) { ring1[ringHead] = -a; ring2[ringHead] = -a; s1 += -a - ring1[ringTail]; s2 += -a - ring2[ringTail]; } else if (smpCount == 3) { ring1[ringHead] = -a; ring2[ringHead] = a; s1 += -a - ring1[ringTail]; s2 += a - ring2[ringTail]; } ringHead = (ringHead + 1) % ringSize; ringTail = (ringTail + 1) % ringSize; if (++smpCount >= 4) { smpCount = 0; if (++cycle >= ringSize) { s = Math.Sqrt(s1 * s1 + s2 * s2) / ringSize; cycle = 0; result = (s - sPrev) >= Threshold; sPrev = s; } } return result; } 


يتم استدعاؤها على كل عينة واردة والعودة الحقيقية في حالة الكشف عن الناقل.

نظرًا لأن الكاشف بعيد عن الكمال ، ويمكن مزامنته بسهولة في منتصف الخط ، أضفت منزلقًا خاصًا ، متحركًا يمكنك من خلاله تحقيق تزامن أكثر دقة.

الآن ، بعد أن درسنا لفترة وجيزة كيف يعمل كل هذا ، دعنا ننتقل إلى الجزء الأكثر لذيذًا: ما الذي يمكن الحصول عليه من كل هذا.

قليلا من الممارسة


أولاً ، دعونا نتحقق من كيفية عمل كل شيء بدون قناة السونار - ببساطة عن طريق إرفاق هوائيات الاستقبال والإرسال مع بعضها البعض.
أولاً ، الصورة أكبر (240 × 120) بحيث يمكن عمل شيء على الأقل:


وبعد ذلك بسرعة ، بحيث يكون هناك المزيد من الحياة مثل الفيديو:


يبدو أن ليس سيئا؟ لكن لا تتسرع في الاستنتاجات ، وانتقل إلى حمام السباحة:


وهنا ، كما وعدت في العنوان ، سنرى صدى بعيوننا:


كيف تحب ذلك ، إيلون موسك؟ هل تحب HD لماذا هذا هكذا؟
وكل شيء بسيط للغاية - الصدى في الحقيقة هو النسخ المتأخرة للإشارة الأصلية ، والتي تتداخل معها بشكل مشهور عند نقطة الاستقبال ، قابلة للطي في مرحلة مختلفة وتعطي صورة من هذا القبيل. نظرًا لأننا ننقل الصورة ، في النهاية نحصل على العديد من الصور المتراكبة على بعضها البعض بسعات مختلفة. كل هذا يؤدي في نهاية المطاف إلى طمس والتكاثر.

إذا نظرنا إلى الوراء ، دعنا نتحقق من كل شيء على نموذج الصورة الكبيرة. لقد التقطت صورة عشوائية:


قمت بتعديلها ، ثم أضفت صدىًا وقليلًا من الضوضاء ، ثم تم فك تشفيرها ، ونعم - تشبه النتيجة ما حصلنا عليه في المجموعة:


من حيث المبدأ ، من الممكن إجراء تفكك وطرح الأفكار ، لكن دع الناس من خارج منطقتنا نترك هذه النقطة للعمل المستقل.

بالمناسبة ، تعمل الطريقة السابقة في البلياردو بشكل أفضل قليلاً ، ولكن أيضًا بشكل سيء - في إشارات النطاق العريض ، تؤدي المسيرات المتعددة والتردد إلى تلاشي انتقائي للتردد ، يبدو في الصورة (قراءة على الطيف) خطوطًا سوداء وبيضاء - حيث تكون الإشارة في الطور المضاد ، وحيث تطورت في المرحلة (في الواقع ، لا تزال هناك مجموعة من الخيارات الوسيطة):


في شهر أبريل ، انتهزنا الفرصة وذهبنا إلى البركة بنموذج اللوح ودلل نفسك هناك أيضًا:




النتيجة لا تختلف كثيرًا عن النتائج التي تم الحصول عليها في المجموعة:




وعلى الفور للمقارنة ، الطريقة السابقة:


وإليك الرسوم المتحركة gif التي تم جمعها من الإطارات المحفوظة ، الطريقة الأولى:


والطريقة 2 ، التي نناقشها في هذه المقالة:


في الختام


كما وعدنا ، أظهرنا كيف يبدو الصدى والرد فعليًا ، ويقضيان وقتًا مفيدًا ويفعلان شيئًا بأيدينا.

في هذا النموذج ، بالطبع ، فإن الطريقة غير قابلة للتطبيق في الممارسة ، ولكن العمل بها سيكون مفيدًا جدًا للمبتدئين.

بشكل عام ، فحصنا في بركة ضحلة ، حيث تكون الظروف غير مواتية للغاية ، وسيكون من الرائع أن يكرر شخص ما تجاربنا في الخزانات الأخرى ، وبالتأكيد سوف يخبرنا عن نتائجها.

إذا كان القارئ يريد فقط أن يحاول (حتى في الهواء باستخدام ميكروفون ومكبرات صوت) ، فهناك روابط للإصدارات:
طريقة 1
الطريقة 2 (من هذه المقالة)

PS

نتطلع حقًا إلى تلقي تعليقات من القراء ، نظرًا لأنه من المهم للغاية أن تفهم أنك تفعل شيئًا دون جدوى (أو دون جدوى ، ثم يجب إيقاف هذا فورًا).

PS / 2

سأجيب على سؤال شائع على الفور: بالنسبة للأسماك والحياة البحرية الأخرى في مرافق الأطفال هذه ، كل هذا غير ملحوظ.

Source: https://habr.com/ru/post/ar453678/


All Articles