Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1 @@
Идея проекта: Мы кодируем информацию в виде нулей-единиц, кодируем ноль и единицу разными частотами (пока что это 1, 2 кц. Предполагается, что определение нужных частот - задача для машинного обучения). После чего преобразуем этот массив в звуковой файл, содержащий синусоиды, проигрываем его, а другим устройством записываем и декодируем. Для отображение зависимости амплитуды от частоты используем преобразование Фурье.
Пояснение, как проходит декодирование с помощью традиционных методов: делим на три класса: модулятор - создает массив (который синусоидальный звук), wav - отвечает за создания файла wav из массива и вообще для работы с wav, decoder - сам дешифровщик, как он работает:
1) Мы получаем на вход массив данных, который является звуковым файлом в котором кроме нужных синусоид содержится тишина (скорее всего шумы), поэтому мы выделяем оттуда сами синусоиды следующим образом:
1.1) "Грубое определение синусоид": смотрим, где на нужных частотах находится какая-то амплитуда (больше, чем рандомный шум) с помощью нормализации.
1.2)Потом, максимизируя нужную функцию (с помощью деления "координатной оси" на три части, см код для подробностей), находим уже точно.
1.x?)Сделать тоже самое, только с помощью машинного обучения?
2) Здесь все должно быть просто: если мы нормально определили, то только на одной из частот должен быть сигнал.
3) profit??
Здесь будут эксперементы
67,343 changes: 67,343 additions & 0 deletions actual_project.ipynb

Large diffs are not rendered by default.

248 changes: 248 additions & 0 deletions playing.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from time import sleep\n",
"from playsound import playsound\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"from scipy.fft import fft, fftfreq, rfft, rfftfreq\n",
"from scipy.io.wavfile import write, read\n",
"from scipy.io import wavfile\n",
"import math\n",
"from time import sleep\n",
"from playsound import playsound\n",
"from math import floor\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"FILENAME = \"tone_ex\"\n",
"def play(filename):\n",
" sleep(0.5)\n",
" playsound(filename)\n",
"\n",
"#Генерация синусоиды с заданными параметрами\n",
"SAMPLE_RATE = 44100 # Гц - частота дискретизации\n",
"\n",
"def generate_sine_wave(freq, sample_rate, duration):\n",
" x = np.linspace(0, duration, int(sample_rate*duration), endpoint=False)\n",
" frequencies = x * freq\n",
" y = np.sin((2 * np.pi) * frequencies)\n",
" return x, y\n",
"\n",
"def signal_modulation(text, freq0, freq1, sample_rate, change_time): #Сама частотная модуляция. Эта часть будет дорабатываться, пока что тут только две частоты(тупо складываем синусоиды двух частот)\n",
" duration = change_time * len(text)\n",
" num = int(duration / change_time)\n",
" time = np.array([], dtype = np.int16)\n",
" signal = np.array([], dtype = np.int16)\n",
" for i in range(num):\n",
" if text[i] == \"0\":\n",
" freq = freq0\n",
" if text[i] == \"1\":\n",
" freq = freq1\n",
" time_diff, data = generate_sine_wave(freq, sample_rate, change_time)\n",
" signal = np.concatenate((signal, data), axis = None)\n",
" time = np.concatenate((time, time_diff), axis = None)\n",
" return time, signal\n",
"\n",
"#Достаем массив данных и частоту дискретизации из файла со звуком\n",
"def wav_data_x_sample_rate(filename):\n",
" sample_rate, data = wavfile.read(filename)\n",
" duration = len(data) / sample_rate \n",
" return data, sample_rate\n",
"\n",
"def get_code_array(max_length):\n",
" code_array = []\n",
" for i in range(4, max_length + 4, 4):\n",
" for z in range(20):\n",
" code = \"\"\n",
" for j in range(i):\n",
" code += str(random.randint(0,1))\n",
" code_array.append(code)\n",
" return code_array"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"play(\"tone_ex\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"code_array = get_code_array(16)\n",
"FREQ1 = 1000\n",
"FREQ2 = 1500\n",
"CHANGE_TIME = 0.1\n",
"SAMPLE_RATE = 44100\n",
"code_array = ['1100',\n",
" '1011',\n",
" '0001',\n",
" '1110',\n",
" '1000',\n",
" '0010',\n",
" '0111',\n",
" '1001',\n",
" '0100',\n",
" '1100',\n",
" '0101',\n",
" '1001',\n",
" '0011',\n",
" '1100',\n",
" '1000',\n",
" '1001',\n",
" '1101',\n",
" '0001',\n",
" '0110',\n",
" '1100',\n",
" '01000001',\n",
" '11100011',\n",
" '00101001',\n",
" '00101111',\n",
" '01101001',\n",
" '01111101',\n",
" '01000011',\n",
" '11101101',\n",
" '10111001',\n",
" '01001001',\n",
" '11111100',\n",
" '10001111',\n",
" '10011110',\n",
" '00010001',\n",
" '01100001',\n",
" '11010011',\n",
" '01011001',\n",
" '10011001',\n",
" '00101010',\n",
" '11100111',\n",
" '011111111100',\n",
" '010010010100',\n",
" '100101101100',\n",
" '000010010011',\n",
" '101001101001',\n",
" '100100010110',\n",
" '101111010010',\n",
" '001110110111',\n",
" '010010011011',\n",
" '110101111100',\n",
" '001101100000',\n",
" '010000111011',\n",
" '100101000010',\n",
" '011100011111',\n",
" '000110001111',\n",
" '101100000110',\n",
" '010100010101',\n",
" '001100001110',\n",
" '011001101111',\n",
" '100000111011',\n",
" '1100010110011011',\n",
" '0100010000111111',\n",
" '0000000110111111',\n",
" '1010011011100001',\n",
" '0111000011101110',\n",
" '0000000011110001',\n",
" '1111011110011011',\n",
" '1010000011010001',\n",
" '0000010011010110',\n",
" '1101100000001010',\n",
" '1001011111110111',\n",
" '0010010011011110',\n",
" '0110100001001110',\n",
" '1101100001110110',\n",
" '0011110100010010',\n",
" '1010000101111100',\n",
" '1100001011111001',\n",
" '0110111010101011',\n",
" '0011000011110100',\n",
" '1011110000001000']\n"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [],
"source": [
"code_array_backup = code_array"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"def play_no_stop(codes_array):\n",
" f = open(\"flag.txt\", \"w\")\n",
" f.write(\"0\")\n",
" f.close()\n",
" num = len(codes_array)\n",
" sleep(3)\n",
" for i in range(num):\n",
" code = codes_array[i]\n",
" x, tone_ex = signal_modulation(code, FREQ1, FREQ2, SAMPLE_RATE, CHANGE_TIME)\n",
" write(\"tone_ex\", SAMPLE_RATE, tone_ex)\n",
" f = open(\"flag.txt\", \"w\")\n",
" f.write(\"1\")\n",
" f.close()\n",
" sleep(1.2)\n",
" play(\"tone_ex\")\n",
" f = open(\"flag.txt\", \"w\")\n",
" f.write(\"0\")\n",
" f.close()\n",
" sleep(2)\n",
" sleep(5)\n",
" \n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"play_no_stop(code_array)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading