Обновить
2

Пользователь

Отправить сообщение
Так мной был описан не метод, а просто факт того, что на АМ приемник можно принять ЧМ сигнал.
Да, и по поводу отстройки, автор ниже верно написал, что для приема ЧМ на АМ, необходимо настроить АМ приемник чуть в сторону от частоты несущей.
Касательно прием АМ на ЧМ приемнике:
Перед тем как ЧМ сигнал подать на контур и начать демодуляцию, его усиливают и пропускают через ограничитель, убирая тем самым так называемую паразитную АМ. Поэтом, на ЧМ приемнике можно принять АМ, но с сильными хрипами и шумами. Голос в принципе разобрать можно, если прислушаться. Это погрешность работы ограничителя. Если ограничитель идеальный, то принять АМ на ЧМ приемнике не получится.
Прием ЧМ на АМ:
Возможен, с тем лишь ограничением, что полосы АМ сигнала чаще всего уже ЧМ сигнала, то есть качество приема будет лучше, чем при «АМ на ЧМ», но все равно будут сильные искажения, хорошо слышимые на слух.
Как в старом анекдоте. Преобразовываем в приемнике ЧМ в АМ и задача сводится к предыдущей :-) Это если совсем кратко.

При демодуляции ЧМ сигнала, его подают на колебательный контур, который настроен на центральную частоту ЧМ сигнала (на несущую, либо на ПЧ), а дальше, поскольку сигнал меняет частоту, то на колебательном контуре меняется амплитуда сигнала, согласно закону изменения частоты, то есть согласно закону изменения модулирующего сигнала — чистой воды АМ сигнал.
В n 64QAM, в ac таки да, 256
Еще, можно добавить, что на практике часто применяются дифференциальные модуляции с дополнительным сдвигом. То есть сигнальное созвездие вращается на каждом символе на дополнительный фиксированный угол. Например Pi/4 DQPSK, сделано это для того, что бы облегчить схемотехнику выходных каскадов, и снизить ток потребления, так как ликвидируется переход сигнала через 0, снижаются требования по линейности усиления выходного каскада. Максимальный угол перехода становится равным не 180 град., а 135 град.
Какая-то совсем непонятная фраза:
В широкополосной — девиация в несколько раз больше частоты несущей до 75 КГц.
Несущая частота нашего радио 101.7 МГц, девиация при этом 75 КГц, что явно не больше в несколько раз несущей.

А по поводу частотной и фазовой модуляции можно сказать, что все это подвиды угловой модуляции. И по большому счету чистая ЧМ редко где используется. Перед тем как подать сигнал на модулятор, его пропускают через фильтры пред-коррекции (pre emphasis), а на приемной стороне наоборот, через фильтр пост-коррекции (de emphasis). Фильтр ВЧ это дифференциатор. В случае с ЧМ, частота передаваемого сигнала пропорциональна амплитуде модулирующего сигнала, а в случае ФМ — амплитуде производной модулирующего сигнала.
Многопозиционной (то есть кодировать не 0 и 1, а большее кол-во дискретных значений) может быть и и частотная манипуляция и фазовая и амплитудная. Собственно КАМ модуляция начинается от 4 позиций и выше. Доходит 64 дискретных уровней.
А при задрачивании в ВоВ семья сама появится? Это все от человека зависит, можно быть жутким трудоголиком, но при этом понимать, что есть еще личная жизнь, которой надо уделять время.
В авиации подобное называется TCAS, только там не Wi-Fi канал конечно.
Для Mac есть в MacPorts но версия 3.3, ф пытался собрать — не осили, самый простой вариант действительно виртуалка и линукс на ней.
Когда упал весной упал суперджет, одна стюардесса Аэрофлота тоже отожгла у себя в личном твиттере, её уволили
lenta.ru/news/2012/05/10/flightattendant/
Я Qwt использовал в одной институтской работе, что бы спектры и осциллограммы рисовать, полученные со звуковой карты. Грузило конечно CPU но тормозов не было. Это было года три наверное назад.
Абсолютно верно, сколько работал с ATMega ни разу не было необходимости в JTAG'е. С ARM и разными RTOS — аналогично. В случае проблем, прикидываешься процессором и сам в голове находишь проблемное место. Логгирование сильно помогает в этом.
Я вам привел ссылку выше, там есть примеры на plain C, клиент там не делает connect, то есть, если сервер примет echo на один интерфейс, а ответит с другого, клиент ответ примет, но произойдет вот это:

    /* Check that client and server are using same socket */
    if (echoserver.sin_addr.s_addr != echoclient.sin_addr.s_addr) {
        Die("Received a packet from an unexpected server");
    }


Вот исходники клиента и сервера по ссылке выше.

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>

#define BUFFSIZE 255
void Die(char *mess) {
    perror(mess);
    exit(1);
}

int main(int argc, char *argv[]) {
    int sock;
    struct sockaddr_in echoserver;
    struct sockaddr_in echoclient;
    char buffer[BUFFSIZE];
    unsigned int echolen, clientlen;
    int received = 0;

    if (argc != 4) {
        fprintf(stderr, "USAGE: %s <server_ip> <word> <port>\n", argv[0]);
        exit(1);
    }


    /* Create the UDP socket */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
        Die("Failed to create socket");
    }
    /* Construct the server sockaddr_in structure */
    memset(&echoserver, 0, sizeof(echoserver));       /* Clear struct */
    echoserver.sin_family = AF_INET;                  /* Internet/IP */
    echoserver.sin_addr.s_addr = inet_addr(argv[1]);  /* IP address */
    echoserver.sin_port = htons(atoi(argv[3]));       /* server port */


    /* Send the word to the server */
    echolen = strlen(argv[2]);
    if (sendto(sock, argv[2], echolen, 0,
               (struct sockaddr *) &echoserver,
               sizeof(echoserver)) != echolen) {
        Die("Mismatch in number of sent bytes");
    }


    /* Receive the word back from the server */
    fprintf(stdout, "Received: ");
    clientlen = sizeof(echoclient);
    if ((received = recvfrom(sock, buffer, BUFFSIZE, 0,
                             (struct sockaddr *) &echoclient,
                             &clientlen)) != echolen) {
        Die("Mismatch in number of received bytes");
    }
    /* Check that client and server are using same socket */
    if (echoserver.sin_addr.s_addr != echoclient.sin_addr.s_addr) {
        Die("Received a packet from an unexpected server");
    }
    buffer[received] = '\0';        /* Assure null terminated string */
    fprintf(stdout, buffer);
    fprintf(stdout, "\n");
    close(sock);
    exit(0);
}



#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>

#define BUFFSIZE 255
void Die(char *mess) {
    perror(mess);
    exit(1);
}


int main(int argc, char *argv[]) {
    int sock;
    struct sockaddr_in echoserver;
    struct sockaddr_in echoclient;
    char buffer[BUFFSIZE];
    unsigned int echolen, clientlen, serverlen;
    int received = 0;

    if (argc != 2) {
        fprintf(stderr, "USAGE: %s <port>\n", argv[0]);
        exit(1);
    }

    /* Create the UDP socket */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
        Die("Failed to create socket");
    }
    /* Construct the server sockaddr_in structure */
    memset(&echoserver, 0, sizeof(echoserver));       /* Clear struct */
    echoserver.sin_family = AF_INET;                  /* Internet/IP */
    echoserver.sin_addr.s_addr = htonl(INADDR_ANY);   /* Any IP address */
    echoserver.sin_port = htons(atoi(argv[1]));       /* server port */

    /* Bind the socket */
    serverlen = sizeof(echoserver);
    if (bind(sock, (struct sockaddr *) &echoserver, serverlen) < 0) {
        Die("Failed to bind server socket");
    }

    /* Run until cancelled */
    while (1) {
        /* Receive a message from the client */
        clientlen = sizeof(echoclient);
        if ((received = recvfrom(sock, buffer, BUFFSIZE, 0,
                                 (struct sockaddr *) &echoclient,
                                 &clientlen)) < 0) {
            Die("Failed to receive message");
        }
        fprintf(stderr,
                "Client connected: %s\n", inet_ntoa(echoclient.sin_addr));
        /* Send the message back to client */
        if (sendto(sock, buffer, received, 0,
                   (struct sockaddr *) &echoclient,
                   sizeof(echoclient)) != received) {
            Die("Mismatch in number of echo'd bytes");
        }
    }
}
Блин, не туда ответил сначала ответ написал

Это исходники nc фаил network.c
Это исходники nc фаил network.c
Примеры echo клиента и сервера на C можно взять например здесь.

Я не в курсе реализации сокетов в скриптовых интерпретаторах, но в статье были фразы типа:

Ну и естественно, никакой уважающий себя сетевой стек не собирается принимать пакеты с совершенно незнакомого адреса, даже если порты стоят правильные.

Но на самом деле, это обычный дефект для протокола без установки сессии, такого как UDP.

Ещё раз: ядро не хранит никакой информации об отправителе или получателе, так как мы работаем без соединений.


Для UDP и имплементации TCP/IP в ядре Linux (да и для многих других имплементаций) эти утверждения не верные, так как нет проблем сделать connect(2), который заставит ядро думать о том, что соединение установлено с конкретным узлом и нет проблем сделать bind к конкретному локальному интерфейсу, вот собственно и все.
Все верно, nc делает connect (я выше описал) я не поленился, глянул в его исходники:

Функция:

int netcat_socket_new_connect(int domain, int type, const struct in_addr *addr,
		in_port_t port, const struct in_addr *local_addr,
		in_port_t local_port)

для всех type'ов сокетов делает connect:

  /* now launch the real connection.  Since we are in non-blocking mode, this
     call will return -1 in MOST cases (on some systems, a connect() to a local
     address may immediately return successfully) */
  ret = connect(sock, (struct sockaddr *)&rem_addr, sizeof(rem_addr));
  if ((ret < 0) && (errno != EINPROGRESS)) {
    ret = -5;
    goto err;
  }
Если не делать connect(2) для UDP сокета, то он будет получать пакеты от любого хоста, не фильтруя их, то есть:
    data->sock = socket ( PF_INET, SOCK_DGRAM, 0 );
    if ( data->sock == -1 ) {
        data->logger->log ( LOGGER_ERROR, "Can't allocate socket.\n" );
        return -1;
    }

    if ( bind ( data->sock, ( struct sockaddr* ) &data->si, sizeof ( data->si ) ) < 0 ) {
        close ( data->sock );
        data->sock = -1;
        data->logger->log ( LOGGER_ERROR, "Can't bind socket.\n" );
        return -1;
    }


а теперь я буду ловить все пакеты на приходящие на порт указанный при bind'е:

rxed = recvfrom ( d->sock, rx_buff, sizeof ( rx_buff ), 0, ( struct sockaddr* ) &si_other, &slen );


Выдержка из man connect(2)

int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);



The connect() system call connects the socket referred to by the file descriptor sockfd to the address specified by addr. The addrlen argument specifies the size of addr. The format of the address in addr is determined by the address space of the socket sockfd; see socket(2) for further details.

If the socket sockfd is of type SOCK_DGRAM then addr is the address to which datagrams are sent by default, and the only address from which datagrams are received.


Так что все зависит от разработчика, как он сделает так и будет, а не от того, уважает себя TCP/IP стек или нет :-)

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность